2017-10-16 51 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'块里面使用了一个非常先进的* verilog特性'procedural assignments',特别是把端口分配给寄存器。你确定你真的想在那里使用'assign a = i'和'assign b = j'吗? – Serge

+0

定义了“a”,“b”和“结果”在哪里?因为他们都推断一位电线。也许你应该打算将它们连接到'x','y'和'product'? – Greg

+0

感谢您的意见和建议。我已经知道我的测试台有什么问题。原来我缺少多模块内的子模块。 – CowEatsGrass

回答

0

延迟可能来自子模块multi。分享它,以便我们提供帮助。

+1

这不是一个答案,只是一个评论。 – Serge

+0

@Serge我必须有50个评论的评论,我有38 – Mortada