如何编写这个verilog测试台?

如何编写这个verilog测试台?,verilog,xilinx,vivado,Verilog,Xilinx,Vivado,我正在使用Vivado为我为FSM编写的一些Verilog代码编写测试台。以下是我从状态图中得出的时序图: 以下是我目前的情况: 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

我正在使用Vivado为我为FSM编写的一些Verilog代码编写测试台。以下是我从状态图中得出的时序图:

以下是我目前的情况:

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_tb
clk_tb
是输入,而
S_tb
V_tb
是输出,我如何包括
S_tb
V_tb
的计时?我不断收到一个错误,说我不能使用
wire
变量。

S_tb
V_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
上述输入被传递到statemachine模块,作为响应,statemachine模块生成一些结果,这些结果在端口
S_tb
&
V_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
连接到半加法器模块的和端口,从而导致输出错误。因此,我建议您避免此类实例调用。我想这可能是错误的原因。

您不需要为状态机输出提供定时延迟。您正在构建一个同步设计;因此,只需在相关时钟边缘(指令的下降边缘)对输出进行采样。每次您想要等待时钟边缘时,都可以通过在测试台中嵌入以下行来实现这一点:

@ (negedge clk_tb) 

然后,您可以捕获输出或直接执行与预期值的比较。然后改变你的输入刺激,等待另一个时钟边缘,重复进行下一次比较

您需要提供错误消息以及
statmachine
模块的定义。