2017-10-16 8 views
-1

私は、加算とシフトを使用して順次乗算器のテストベンチを作成しようとしています。 しかし、入力と出力の波形が20nsずれて問題に遭遇しています。私の入力はt = 0nsで信号を受信しますが、t = 20nsまでは出力に信号がありません。 (t = 0からt = 20までの出力はすべてXXです)。視覚的に20nsの遅延を無視して、私の結果は正しいです。しかし、入力出力波形が20ns間違っているため、tclコンソールは正しくないことを通知します。Verilog順次ロジックテストベンチ

以下
module multiplier_testbench; 
reg[3:0]x,y; 
wire [7:0] product; 
integer i,j; //loop counter 
integer k = 0; 
reg clock, reset, enable; 

multi mul(clock, reset, enable, a,b, result); //Instantiate multiplier module 

initial 
    begin 

     clock = 0; 
     reset = 0; 
     enable = 0; 

     for(i = 0; i < 16; i = i + 1) 
     begin 
      for(j = 0; j < 16; j = j + 1) 
      begin 
       clock = 1; 
       enable = 1; 

       assign a = i; 
       assign b = j; 

       #5; 
       clock = 0; 
       enable = 0; 
       #5; 

       if(result !== {a} * {b})//comparing result using * operator in verilog 
       begin 
       $display("Wrong"); 
        k = k + 1; 
       end 
      end 
     end 
     if (k == 0) $display("success"); 
     else $display("%d Error(s)", k); 
    end 
    endmodule 

は、テストベンチで生成された波形である:以下は私のコードである enter image description here

私は20nsのことで入力を遅らせることを試みたが、それは単に出力に追加の20nsを追加します。私は問題が私の時計から来ると信じていますが、私はそれを他の場所に置くことに成功しませんでした。私は本当にそれに近づいていることを知っていますが、何が間違っているのか分からないようです。

ありがとうございます。

+0

あなたは 'initial'ブロックの中で非常に* advanced * verilogの機能' procedural assignments 'を使いました、特にポートをレジスタに割り当てました。あなたは本当に 'assign a = i'と' assign b = j'を使用したいと思っていますか? – Serge

+0

'a'、' b'、 'result'はどこに定義されていますか?そうであるように、それらはすべて1本のビット線と推測される。おそらく、それらを 'x'、' y'、 'product'に接続しようとするべきでしょうか? – Greg

+0

アドバイスと提案をありがとう。私はテストベンチで何が間違っているのかを理解しました。それは私がマルチモジュールの中にサブモジュールがないことがわかった。 – CowEatsGrass

答えて

0

サブモジュールmultiから遅延が発生している可能性があります。私たちが助けることができるようにそれを共有してください。

+1

これは答えではなく、単なるコメントです。 – Serge

+0

@ Serge私はコメントするには50の評判が必要です、私は38 – Mortada