我该如何编写Verilog测试平台?

时间:2018-09-26 22:57:59

标签: verilog xilinx vivado

我是Verilog的新手,并且正在使用Vivado尝试为我为FSM编写的一些Verilog代码编写测试平台。 Here is the timing diagram which I derived from state diagram。以下是我到目前为止的情况

Original FSM

module testbench();
     reg X_tb, clk_tb, rstn_tb;
     wire S_tb, V_tb;

     statemachine statemachine_tb(X_tb, clk_tb, rstn_tb, S_tb, V_tb);

     initial begin
          #10 X_tb = 0;
     end
endmodule

如果X_tbclk_tb是输入,而S_tbV_tb是输出,我如何包括S_tbV_tb的时间?我不断收到错误消息,说我不能使用wire变量。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

S_tbV_tb是由设计模块(在本例中为“状态机”)确定的预期输出。 测试平台涵盖了设计,它可以刺激您的设计。在这种情况下,您将应用类似

的输入
initial
begin
 rstn_tb = 0; //assuming an active low reset
 clk_tb  = 0;
 #10 X_tb = 0;
end
always  
#5 clk_tb = ~clk_tb; //generates a clock having a frequency of 100MHz

上述输入被传递到状态机模块,并作为响应,状态机模块生成一些结果,该结果在端口S_tbV_tb处接收。

在实例化模块时,最好使用点名称约定(例如

module half_add(a,b,sum,carry); //half adder, partially written
 input a,b;
 output sum,carry;
 //logic
 endmodule

module full_add(a,b,cin,sum,carry)
 input a,b,cin;
 output sum,carry;
 //wires are not declared
 //instantiating half_add
 half_add h1(.a(w1),
        .b(w2),
        .sum(sum1),
        .carry(carry1)
    );

half_add h2(
 //similar call as h1 instance
   );
endmodule

如果我像下面的例子那样实例化模块,那么上面的实例类型现在可以避免错误

half_add h1(w1,
        w2,
        sum1,
        carry1
);

这里是根据位置连接端口的,可能会在写时出错,就像偶然地在写

half_add h1(w1,
        w2,
        carry1,
        sum1
);

这将导致carry1连接到半加法器模块的求和端口,从而导致错误的输出。因此,我建议您避免这种类型的实例调用。我想这可能是错误的原因。

答案 1 :(得分:0)

您不需要为状态机输出提供时序延迟。您正在构建同步设计;因此,应仅在相关的时钟沿(指令的下降沿)对输出进行采样。为此,您可以在每次要等待时钟沿时将以下行嵌入到测试台中:

@ (negedge clk_tb) 

然后可以捕获输出或直接执行与期望值的比较。然后更改您的输入激励,并等待另一个时钟沿,然后重复进行下一次比较。