我是Verilog的新手,并且正在使用Vivado尝试为我为FSM编写的一些Verilog代码编写测试平台。 Here is the timing diagram which I derived from state diagram。以下是我到目前为止的情况
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
变量。任何帮助将不胜感激!
答案 0 :(得分:1)
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
上述输入被传递到状态机模块,并作为响应,状态机模块生成一些结果,该结果在端口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
连接到半加法器模块的求和端口,从而导致错误的输出。因此,我建议您避免这种类型的实例调用。我想这可能是错误的原因。
答案 1 :(得分:0)
您不需要为状态机输出提供时序延迟。您正在构建同步设计;因此,应仅在相关的时钟沿(指令的下降沿)对输出进行采样。为此,您可以在每次要等待时钟沿时将以下行嵌入到测试台中:
@ (negedge clk_tb)
然后可以捕获输出或直接执行与期望值的比较。然后更改您的输入激励,并等待另一个时钟沿,然后重复进行下一次比较。