• 締切済み

Verilogのinoutをシミュレートする方法について

Verilogのinoutをシミュレートする方法について わからないので質問させてください。 SRAMのシミュレーションモデルを書いてみて、いざ、シミュレータで シミュレーションしようと思ったのですが、テストモジュールから inoutであるdataへ接続する方法をwireでやるべきか、regでやるべきか不明で 困っています。 良い方法があれば教えていただけますでしょうか? (できれば、シミュレーション対象のソースを変更しない方法がいいです) また、Verilogのシミュレーションモデルを配布しているHPなどありましたら教えていただけますか? よろしくお願いします。

みんなの回答

  • bug_bug
  • ベストアンサー率78% (36/46)
回答No.2

> ということは、O2海シミュレーションをかけなくてはならないのでしょうか? 質問の意図がよく分かりませんが, "2回"シミュレーションを実施しなければならないか?という疑問であれば, 1度で済みますがシミュレーションは必要な確認項目をすべて実施しなければなりません. 満たすべき仕様に応じて検討し, initial構文内に列挙すれば事足りるでしょう. > 出力を見るときはそのままで、入力波形を見るときは出力をHi_Zするということでしょうか? 入出力の用語定義があいまいですが, 検証対象である擬似SRAMからの出力を見る場合(READ), テストベンチ内のregと信号が衝突しますのでregを事前にHi-zにしておく必要があります. 擬似SRAMへのWRITEを行う場合は入力値をregに書き込んであれげばwireを経由し検証対象へ入力される仕組みです. 誰が信号線をドライブしているのか?をイメージできると割と簡単に理解できると思います.

  • bug_bug
  • ベストアンサー率78% (36/46)
回答No.1

inout信号のシミュレーションはwireとregを組み合わせて実施可能. 出力値を取得する場合, regをHi-zにする必要があります. 以下, 参考(ただし未検証. 適当にインデントが必要) module tb_target() paramter STEP = 10; wire DIO; reg DO; target U1( .DIO(DIO), ... ); assign DIO = DO; initial begin //-- WRITE DO = 1'b0; #STEP DO = 1'b1; //-- READ #STEP DO = 1'bz; #STEP if ( DIO == ... ) ... end end module

ok_satosi
質問者

お礼

お礼が遅れてしまい申し訳ありません。 図も入れていただき丁寧な説明ありがとうございました。 ということは、O2海シミュレーションをかけなくてはならないのでしょうか? 出力を見るときはそのままで、入力波形を見るときは出力をHi_Zするということでしょうか?

関連するQ&A

  • Verilogで動的なモジュールを作る方法

    Verilogで動的なモジュールを作る方法 たとえば、どのような周波数であっても 1秒のウェイトをする回路を作りたいと思っています。 試験的に、 `define time (1) //1S `define tCK (20) //周期20nS module wait( input iCLOCK, input inRESET, output reg oWAITEND); localparam = loop_end (1/(`time * 1000000000))/`tCK; reg [31 : 0] loop; always@(posedge iCLOCK or negedge inRESET)begin if(inRESET == 1'b0)begin loop <= 32'h00000000; end else begin if(loop < loop_end)begin loop <= loop + 32'h00000001; oWAITEND <= 1'b0; end else begin oWAITEND <= 1'b0; loop <= loop; end end end //always endmodule というものを作って、defineの値(このdefineは別ヘッダファイルからincludeしてやりました)を変えてやれば目的の周波数で動き、目的のウェイト作るモジュールををソース自体を変えずに得られると思いましたが、 シミュレーションではうまくいったものの、QuartusIIではうまく論理合成されませんでした。 もし、他に方法がありましたら教えていただけないでしょうか? よろしくおねがいします。

  • フリーのverilog-HDLシミュレータ

    Windows上で動作するフリーのverilog-HDLシミュレータを探しています。 Siliosが少し前までフリーでダウンロードできたそうなのですが、今はダウンロードが禁止されています。。 例えば、このような回路を波形を見ながら解析したいと考えています。 //○シミュレーション対象:4ビット加算回路 module adder ( a, b, q ); input [3:0] a,b; output [3:0] q; assign q = a + b; endmodule //○シュミレーション記述 `timescale 1us/1us module adder_test; reg [3:0] a,b; wire [3:0] q; parameter STEP=1000 adder adder ( a, b, q ); initial begin a = 4'h0; b = 4'h0; #STEP a = 4'h5; b = 4'ha; #STEP a = 4'h7; b = 4'ha; #SEEP $finish; end endmodule

  • 「入門Verilog HDL記述」 の 一例について

    「入門Verilog HDL記述」を読みながらVerilog を勉強中なのですが、周りに聞ける人がいないので、質問させてください。 (ちなみに VHDL は習得しているつもりです。) いろいろ疑問点があるので、分けて何点か質問させていただきました。 改訂版 入門Verilog HDL記述の240ページのリスト II.5に generate ブロックと if 分についての以下のようなコードがありますが、 これは期待通りには動かないと思うのですが。。。 module sel2to1_2( input sel, input [3:0] d0, d1, output [3:0] dout ); parameter sel_type = 1; generate if(sel_type == 1) begin: sel_always reg [3:0] dout; always @* begin if(sel) dout <= d1; else dout <= d0; end end else if(sel_type == 2) begin: sel_cond wire [3:0] dout; assign dout = (sel == 1) ? d1 : d0; end endgenerate endmodule ModelSimでシミュレーションしてみましたが、generate文の中の reg [3:0] dout は generate 文の中のスコープでのみ定義されているらしく、 output [3:0] dout とは別の信号らしいです。よってoutputには何も代入されず。 試しに、xilinx の ISE でコンパイルしてみたが、やっぱり output には なにも接続されず、セレクタなんて生成されませんでした。 そもそも module sel2to1_2( input sel, input [3:0] d0, d1, output [3:0] dout ); reg [3:0] dout; みたいに書くと、2回宣言されているとなってエラーになります。 よって、参照ソースコードみたいに reg と wire を切り替えるような書き方はそもそもできないのでは? 皆さんどう思われますか? (インデントがうまくいかず、読みづらくてすいません。)

  • verilogでのwhile文について質問

    verilog初心者です。 while文での処理を記述していたのですが、 下記のように変更するとエラーとなってしまいます。 なんとか出来る方法はないでしょうか? module TEST(in_data, state, clock, reset, out); input [9:0] in_data; input [5:0] state; input clock; input reset; output [5:0] out; reg [5:0] out; always@(posedge clock or negedge reset) begin if(reset == 0) begin out = 0; end else begin out = in_data; while(out > 7)begin out = out >> 1; end end end // always@ (posedge clock or negedge reset) endmodule // TEST 上のように書くと、合成でき、シミュレーションでも期待する値は得ることが出来ました。 以下のようにwhile文を変更するとエラーとなってしまいます。 while(out > state)begin out = out >> 1; end よろしくお願いします。

  • FPGA/Verilogでのモジュールの違い

    現在,FPGAとVerilogを用いて、モータの回転数をセンサでカウントする回路を作成しています。 countという名前のカウント回路を作成し、2つのセンサ(センサ1とセンサ2)があるため、count1,count2とインスタンスを2つ作成しています。 トップモジュールでは以下のように宣言しています。 count count1( .CLK( CLK), .SENSOR( SENSOR1), .COUNT_DIGI_0( COUNT_DIGI_20), .COUNT_DIGI_1( COUNT_DIGI_21), .COUNT_DIGI_2( COUNT_DIGI_22), ); count count2( .CLK( CLK), .SENSOR( SENSOR2), .COUNT_DIGI_0( COUNT_DIGI_0), .COUNT_DIGI_1( COUNT_DIGI_1), .COUNT_DIGI_2( COUNT_DIGI_2), ); countモジュール内では、SENSORが入力されると、カウント数が1upするだけです。 COUNT_DIGI_*は別の回路にカウント数を伝えるためにwireで接続しています。 最初に,センサ1をcount1に、センサ2をcount2に接続したところ、2つのカウント数に相違がでてしまいました。(count2のカウント数が多い) センサの配線が悪いと思い、センサ1の出力をcoun1とcount2に接続してテストしてもカウント数に相違がでてしまいました。 なぜ、同じモジュールを使用し、入力も同じなのに、結果に違いが出るのでしょうか? FPGAの特性などがあるのでしょうか? お分かりになられる方がいらっしゃいましたら宜しくご教授お願い致します。

  • verilogである信号の数クロック遅れの信号を生成させる記述方法をお

    verilogである信号の数クロック遅れの信号を生成させる記述方法をお伺いします。 動作記述でOKです。 通常、「sig_a」 から2クロック遅れの「sig_b」を生成させるのなら: > sig_a - 2clockおくれ -> sig_b ----------------------------------- reg [2:0] regs; assign sig_b = regs[2]; asisgn regs[0] = sig_a; always @(posedge CLK) regs[2:0] <= {regs[1:0], sig_a}; ----------------------------------- のように、パイプラインに信号を通すことで実現できるですが、 何クロック遅れるかを可変(動的に設定する)としたいのです。 動作モデル的な記述で簡単にかけないのでしょうか? ------------------------------------ [NGの例]: これだとNcycle_delayがSIM途中で更新されたとき、反映できない。。。 initial begin  sig_b <= #D 1'b0;   while(1) begin   repeat(Ncycyle_delay) @(posedge CLK);    while(1) begin     sig_b <= sig_a;     repeat(1) @(posedge CLK);    end   end end ------------------------------------ 宜しくお願い致します。

  • ACCESSのmdeファイルについて

    ACCESS97の環境でmde形式で資源を配布しました。 そのモジュールを確認したいのですが、 モジュールの修正・削除はしなくてもよいので ソースの内容を確認する方法はないでしょうか? 御教授願います

  • SMAコネクタの影響を取り除く方法

    現在、電磁界シミュレータの精度を検証しているの ですが、さすがにSMAコネクタはシミュレーション 出来ないので実測データからその影響を取り除きたい と考えています。何か良い方法はございませんで しょうか?逆フーリエ変換して時間領域のデータに した上で何か処理を行うとか…。 それが無理な場合は、SMAコネクタとFR4基板の接続 箇所における不整合まで考慮した正確なSMAコネクタ のモデル作成方法でも結構です。もし何かアイデアが ありましたら教えて下さい。よろしくお願い致します。

  • EzWebシミュレータの端末情報送信

     現在、auのブラウザをパソコン上で再現する「openwave[http://developer.openwave.com/ja/]」を使って、au携帯によるPHP端末認証プログラムを作成しているのですが、端末IDヘッダ(HTTP_X_UP_SUBNO)を取得することができません。  NTT DoCoMoが配布しているシミュレータ[http://www.nttdocomo.co.jp/p_s/imode/flash/tool2.html]では端末IDの送信もシミュレートしてくれるのですが、openwaveではできないのでしょうか。もしできるのであれば、送信するための設定方法をお教えください。

  • FPGAで自動販売機が動作しません

    今、自分は大学3年生です。 研究で自動販売機の動作を教科書を参考にVHDLを使って設計してます。 教科書のソースに機能を足しコンパイルしたところ無事通り、シミュレーション上では動作はしました。しかし、実際にFPGAに載せて動かしたところ予想できない動作をしました。 教科書にあった手を加えていないソースもシミュレーションでは教科書に載っていたシミュレーションと同じ動作は確認できましたが、FPGAに載せた時の動作はおかしかったです。 動作環境は、ツール:QuartusII9.0, FPGAボード:EP1K10TC100-3です。 スイッチには、init,100円,コーラ120円の商品ボタン,キャンセルの4つを、出力はコーラの120円商品の出力だけをLEDにピンを割り当てました。 シミュレーションでの動作は確認できても、実機に載せたところ動作がおかしくなるのですが、動作の確認やできた論理回路の確認をするにはどのような方法がありますか? もしくは入出力の信号を全部ピンに割り当てないことにはシミュレートしたときの動作とはまた違ってくるのでしょうか? ご教授ください、お願いします。

専門家に質問してみよう