見出し画像

ChatGPTに回路設計をやらせてみた


ChatGPTにプログラムを書かせたという話はよく聞きますが、回路設計はやってくれるのか?試してみました。
モチーフとした回路は以下の資料に出てくる自動販売機のお釣りを計算する回路です。

http://www-vlsi.es.kit.ac.jp/~kobayasi/refresh/0012/slide.pdf

結果としては、RTL設計でもcopilot的な感じで使えそうに思います。
細かい部分の辻褄合わせは苦手そうなので
ベースを作成してもらって、それを人が手直しする形がよさそうです。

仕様作成

まずは仕様の作成を依頼。
タイミングチャートも書いて欲しかったですが、テキストでしかお絵描きできないようなのでなし。

入力
入金額 (N) - これは自動販売機に投入されたお金の総額です。
商品金額 (P) - これは自動販売機に表示された商品の値段です。
商品の選択状態 (S) - これは自動販売機のボタンが押されたことを示す信号です。

出力
お釣り (C) - これは自動販売機が出力するお金の総額で、入金額から商品金額を引いた差額です。

仕様
商品の選択状態が"ON"の場合、入金額が商品金額以上の場合、お釣りを計算し出力します。
商品の選択状態が"ON"の場合、入金額が商品金額未満の場合、お釣りを計算せずに出力します。
商品の選択状態が"OFF"の場合、お釣りを計算せずに出力します。
お釣りの硬貨・紙幣の種類や枚数は考慮しなくて良いものとします。
以上が、商品のボタンが押された時にお釣りの額が計算されるようにした回路の仕様になります。
ChatGPTによる回答(2023/4/7)

RTL設計

RTL書いてくださいとだけお願いしたら以下を出力してくれました。

module vending_machine (
 input clk,
 input reset,
 input [7:0] product_price,
 input [7:0] deposit,
 input btn,
 output [7:0] change,
 output reg dispense
);

reg [7:0] total_deposit;
reg [7:0] purchase_price;
reg [7:0] change_amount;

always @(posedge clk) begin
 if (reset) begin
   total_deposit <= 0;
   purchase_price <= 0;
   change_amount <= 0;
   dispense <= 0;
 end
 else begin
   total_deposit <= total_deposit + deposit;
   if (btn) begin
     purchase_price <= product_price;
     change_amount <= total_deposit - purchase_price;
     total_deposit <= 0;
     dispense <= 1;
   end
   else begin
     dispense <= 0;
   end
 end
end

assign change = change_amount;

endmodule

この回路では、clkとresetの2つの入力、および商品の値段、入金額、商品ボタン、お釣りの額、商品の発行を制御するdispense出力を持っています。total_depositは現在の総入金額を、purchase_priceは選択された商品の価格を、change_amountはお釣りの額を表します。データパスと制御パスは同じalwaysブロック内で処理され、if-else文によって分岐が行われます。選択された商品の価格をpurchase_priceに保存し、お釣りの額をchange_amountに計算します。また、商品ボタンが押されると、dispense信号が1に設定され、お釣りが計算されます。それ以外の場合、dispense信号が0に設定され、何も起こりません。
ChatGPTによる回答(2023/4/7)

検証

今は環境がないのでシミュレーションはできませんが、
テストベンチは書いてもらいました。
元のRTLは正確には覚えてくれないようで、pinの名前が変わってしまってます。
また、他のケースも含めた脳内検証はfailしました。

module testbench();

 // Inputs
 reg [7:0] item_price;
 reg [7:0] inserted_amount;
 reg clk;

 // Outputs
 wire [7:0] change_amount;
 wire item_purchased;

 // Instantiate the DUT
 vending_machine dut(
   .clk(clk),
   .item_price(item_price),
   .inserted_amount(inserted_amount),
   .change_amount(change_amount),
   .item_purchased(item_purchased)
 );

 initial begin
   // Initialize inputs
   item_price = 50;
   inserted_amount = 100;
   clk = 0;

   // Wait for 1 clock cycle
   #5;

   // Toggle clock and test
   clk = 1;
   #5;
   assert(change_amount == 50) else $error("Test failed: Incorrect change amount");
   assert(item_purchased == 1) else $error("Test failed: Item not purchased");

   // End simulation
   $finish;
 end

endmodule
ChatGPTによる回答(2023/4/8)

論理合成

さすがに論理合成はできないそうです。

申し訳ありませんが、私は回路のネットリストを生成する機能を持っていません。回路シミュレーションソフトウェアを使用して、RTL記述をコンパイルしてネットリストを生成することができます。また、RTL記述をハードウェア記述言語(HDL)に変換してから、HDLシミュレータを使用してシミュレーションを実行し、ネットリストを生成することもできます。
ChatGPTによる回答(2023/4/8)

この記事が気に入ったらサポートをしてみませんか?