Verilog-HDLでの回路記述方法と故障の記述について

このQ&Aのポイント
  • Verilog-HDLを使用して回路を記述する際の基本的な方法を説明します。
  • 特定のビットが常に0になるような故障の記述方法について解説します。
  • 回路の入力線を制御する方法と、故障を仮定する場合の記述方法について説明します。
回答を見る
  • ベストアンサー

Verilog-HDLでの記述方法

Verilog-HDLで回路を記述しているのですが、疑問点があるので質問させていただきます。 回路記述はおおまかに以下のようなものです。 module Adder(A, B, S, C); input [3:0] A; input [3:0] B; output [3:0] S; output C; 4ビット加算器のインスタンス(.A(A), .B(B), .S(S), .C(C)); endmodule この回路への入力は上位モジュールから与えられるとします。 このような回路記述をしていたとして、たとえば入力線Aの特定のビットが常に0になってしまう故障を記述したいとき wire err = 1'b0; assign A[0] = err; という記述を追加してみたのですが、どうもA[0]には不定値が入り込んでいるようです。 このような記述ではA[0]を常に0にすることはできないのでしょうか?またこのような故障を仮定したい場合はどのように記述すべきなのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

テストベンチで下記のように記述するのが普通です。 initial begin #0; //←故障させたい時間 force ***.***.A[0] = 1'b0; end ***はインスタンス名です。 不定が入ったのは信号がぶつかっているからです。

iy0kan
質問者

補足

ご回答ありがとうございます。 やはりテストベンチで記述するのが普通なんですか。 ということは、たとえばこの回路への入力が他のモジュールの出力だった場合、この上のモジュールで故障の仮定をしないといけないっていうことになるわけですね。

その他の回答 (1)

回答No.2

#1です。 > たとえばこの回路への入力が他のモジュールの出力だった場合、この上のモジュールで故障の仮定をしないといけないっていうことになるわけですね。 ん? force TestBench.MOD_A.ADD.A[0] = 1'b0; と書けば、 インスタンスTestBenchの下のインスタンスMOD_Aの下のインスタンスADDの下のwire A[0]を直接1'b0にできますよ。 上のモジュールでは1'b0にならないはずです。

iy0kan
質問者

お礼

非常に言葉足らずで申し訳ないです。 究極の目的としてはこのモジュール内で故障を仮定できるかどうかということを知りたかったのですが、それはできないということで解決いたしました。 ありがとうございました。

関連するQ&A

  • フリーの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 3_5セレクタ

    Verilog_HDLで3_5セレクタを作成しているのですが、うまくいかないので助けてください。 1つの4ビットの入力と2つの5ビットの入力の中から5ビットの出力を選び出す回路です。入力が4ビットのとき、最上位に0をつけ、5ビットにする。SELの組み合わせにより、出力を選択する。 /* 3-5SELECTOR */ module SEL3_5module (A, B, C, SEL, OUT); input [3:0] A; input [4:0] B, C; input [1:0] SEL; output [4:0] OUT; wire [4:0] IN; CONECT (A[0],IN[0]); CONECT (A[1],IN[1]); CONECT (A[2],IN[2]); CONECT (A[3],IN[3]); CONECT (0,IN[4]); assign OUT = SEL4_5_FUNC (IN, B, C, SEL); function [4:0] SEL4_5_FUNC; input [4:0] IN, B, C; input [1:0] SEL; case ( SEL ) 0: SEL4_5_FUNC = IN; 1: SEL4_5_FUNC = B; 2: SEL4_5_FUNC = C; 3: SEL4_5_FUNC = 0; endcase endfunction endmodule エラー文はError: Node instance "comb_4" instantiates undefined entity "CONNECT" Error: Node instance "comb_5" instantiates undefined entity "CONNECT" Error: Node instance "comb_6" instantiates undefined entity "CONNECT" Error: Node instance "comb_7" instantiates undefined entity "CONNECT" Error: Node instance "comb_8" instantiates undefined entity "CONNECT" です。 よろしくお願いします

  • verilog 符号付加減算(最上位符号拡張)について教えてください

    verilog初心者で、(2の補数形式)符号付加減乗算器を作成しています。 …が符号拡張のところで解決できずにいます f(--;) もとの数a,bの最上位ビット(符号ビット)を16ビット分(乗算器に あわせ)増やすことは理解できたのですが、それをどうverilog 記述すればいいのかわかりません。下記にある記述ではエラーと なってしましました。 0拡張や、演算結果の最上位ビットだけを符号ビットにしてみたりし たのですが、これではダメとのことで もうどうやったらいいのか わからなくなってきました。(TT); どなたか教えてください。 m(_ _)m -------------------------------------------------------------- module kadai(a,b,c,q); input [15:0] a,b; input [2:0] c; output [32:0] q; wire [32:0] q; assign q =(c == 3'b000)?{16{a[0]},a}+{16{b[0]},b}: (c == 3'b001)?{16{a[0]},a}-{16{b[0]},b}:      (c == 3'b010)?{16{a[0]},a}*{16{b[0]},b}; endmodule ---------------------------------------------------------------- {16{a[0]},a}や{16{a[0]},b}という表現がいけないようなのですが… よろしくお願い致します。

  • 「入門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 を切り替えるような書き方はそもそもできないのでは? 皆さんどう思われますか? (インデントがうまくいかず、読みづらくてすいません。)

  • 2ビットのレジスタのVerilog HDL記述

    QuatusIIで2ビットのレジスタをつくっているのですが、ブロック図をコンパイルするときにエラーがでてしまいます。 エラー内容をみるとVerilog HDL記述が間違えているみたいなのですが、どこが間違えているか教えてください。 /* REG2 */ module REG2module ( EN, CLR_B, IN1, IN2, CLK, Q ); input CLR_B, CLK; input IN1, IN2; output [1:0] Q; output EN; assign EN=FUNC_EN (IN1, IN2); function FUNC_EN; input IN1,IN2; if (IN1>0|IN2>0) FUNC_EN=1; else FUNC_EN=0; endfunction wire [1:0] D; CONECT (IN1,D[0]); CONECT (IN2,D[1]); reg [1:0] Q; always @( posedge CLK or negedge CLR_B ) if( !CLR_B ) Q <= 0; else if(EN) Q <= D; endmodule エラーにはError: Node instance "comb_8" instantiates undefined entity "CONECT" Error: Node instance "comb_9" instantiates undefined entity "CONECT" と出ています。意味を調べたのですが、CONECTが定義されていない?という事は具体的にどうすればいいでしょうか。 CONECT (IN1,D[0]); CONECT (IN2,D[1]); の部分が間違っているのはなんとなくわかるのですが、どうしたらいいかわかりません。 よろしくお願いします

  • verilog初心者です 符号拡張について教えください

    また似たような質問で申しわけないです。(T T;) 入力16ビット、出力を32ビット(←乗算器にもつなぐ入力の為)全加算器verilog記述についての質問です ****************************************************************//fulladder_16.v `timescale 1ns/10ps module fulladder_16(a,b,q); input [15:0] a,b; output [32:0] q; wire [15:0] cin; //module fulladd.v instance fulladd add0(.a(a[0]),.b(b[0]),.cin(1'b0),.q(q[0]),.cout(cin[0])); fulladd add1(.a(a[1]),.b(b[1]),.cin(cin[0]),.q(q[1]),.cout(cin[1])); fulladd add2(.a(a[2]),.b(b[2]),.cin(cin[1]),.q(q[2]),.cout(cin[2])); : : fulladd add14(.a(a[14]),.b(b[14]),.cin(cin[13]),.q(q[14]),.cout(cin[14])); fulladd add15(.a(a[15]),.b(b[15]),.cin(cin[14]),.q(q[15]),.cout(cin[15])); /*fulladd add0(.a(a[0]),.b(b[0]),.cin(1'b0),.q(q[0]),.cout(cin[0])); fulladd add1[15:1](.a(a[15:1]),.b(b[15:1]),.cin(cin[14:0]),.q(q[15:1]),.cout(cin[15:1]));*/ assing q = {{17{q[15]}},q}; endmodule /*ここでqの17~33bit目までを、上の記述のqの最上位ビットで拡張したくてこのように記述したのですが、この記述ではうまくいきません。 q =(算出された16ビットの最上位ビット × 17)と(算出された16ビット)  で33ビットにしたいわけです。どのように記述したらいいでしょうか?教えてください!!m(_ _)m ちなみにインスタンスしたのはしたの全加算器です //fulladder `timescale 1ns/10ps module fulladd(a,b,cin,q,cout); input a,b,cin; output q,cout; assign q = a^b^cin; assign cout = (a & b)|(b & cin)|(cin & a); endmodule

  • Verilog-HDLからVHDL記述への書き方について

    Verilog-HDLからVHDLへ変換をしています。1ヵ所だけ、記述の書き方がわからないので、アドバイス下さい。 module sample(ck,res,trg,busy,sclk,cs_n,sdata,data); input ck, res, trg, sdata; output busy, sclk, cs_n; output [15:0] data; reg [4:0] cnt; reg busy, cs; reg [15:0] buff, data; wire adend; assign sclk = ck; assign adend =(cnt==5'd20); <= この部分のVHDL記述が分かりません。 -------------------------- assign sclk = ck; をVHDLで表すと、 sclk <= ck;ですが、 assign adend =(cnt==5'd20);これは、adendは1bitで、cntは5bitなので、表現しようがありません。 ふと思ったのは、 5'd20は、10100なので、下記の記述も可能か自信がありません。 adend <= cnt(5) and cnt(3); アドバイス下さい。 よろしくお願いします。

  • verilogの演算について

    verilogについて、演算途中に値が極端に大きくなった場合はどうなるのでしょうか? 例えば、全ての信号が8bitとして、以下の式について、 output = input1 * input2 >> 8; input1,input2がともに、255のとき、 input1 * input2を計算した段階で、16'b1111111000000001というように極端に大きな値になりますが、ちゃんと、この値から8bit分シフトして、outputに8'b11111110が代入されるのでしょうか?

  • verilogでデマルチプレクサの作り方

    verilog初心者です。 ISEにてロジックを作成しているのですが、 verilogでデマルチプレクサをつくりたいのですが良い参考資料が 見当たらない為困っています。 module SEL(CLK, S, OUT); input CLK; input [2:0] S; output [3:0] OUT; といったような構成なので このクロック信号をセレクト結果によって たとえば s=000 OUT[0]=CLK OUT[1]=0 OUT[2]=0 OUT[3]=0 s=001 OUT[0]=0 OUT[1]=CLK OUT[2]=0 OUT[3]=0 といったようにしたくて、case文等を使用して 出力させようと記述してみたものの、エラーでパラで出力できない と表示されます。 何卒アドバイスをお願いします。

  • 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ではうまく論理合成されませんでした。 もし、他に方法がありましたら教えていただけないでしょうか? よろしくおねがいします。