如何编写这个verilog测试台?
我正在使用Vivado为我为FSM编写的一些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
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
模块的定义。