首页 > 解决方案 > 我如何编写这个 verilog 测试平台?

问题描述

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

时序图.

原始 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变量。

标签: verilogxilinxvivado

解决方案


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连接到半加器模块的和端口,从而导致错误输出。因此,我建议您避免这种类型的实例调用。我想这可能是错误的原因。


推荐阅读