Verilog循环测试台(优先级,值问题)

时间:2018-12-02 11:45:45

标签: verilog

对于i=0j=0,此代码使我的a,b,cin and s信号为xxxxxxxx

对于i=0j=1,我的a,b,cin and s都是00000000。对于i = 0 j = 0 cin = 0,我的加法器应该是哪个结果。怎么了?我确定我的加法器模块正确。

http://prntscr.com/lpngel

http://prntscr.com/lpngih(...等等)

大多数麻烦首先出现在for循环中,并在某些值未打印出来时开始,然后在每个循环中添加begin end之后,我看到了上述问题的完整循环结果^ ^^^^。仍然不知道它是如何工作的,但确实是这样

module test_cla4_n;

    reg [7:0] a,b;
    reg cin;

    wire [7:0] s;
    wire cout;

    integer i;
    integer j;
    integer cv;

    cla4_n#(.n(8)) UUT
        (.a(a), .b(b),
              .cin(cin),
             .s(s), .cout(cout));

    initial 
     begin
    for(cv=0;cv<=1;cv=cv+1)
     begin
        for (i=0;i<6;i=i+1) 
         begin
            for (j=0;j<6;j=j+1)
             begin
                #100 a = j; b = i; cin = cv;

             end
         end
     end

     end

    initial
     begin
    $monitor($time,   ,"a=%9b, b=%9b, cin=%b, sum=%9b", a, b, cin, s); 
     end
    endmodule

2 个答案:

答案 0 :(得分:1)

只要您了解延迟是如何工作的,是否在工作分配之前或之后放置def PolynomialKernel(x,y,p): return (np.matmul(x,y.T)+1)**p def DualFunction(L): return np.matmul((ytrain*ytrain),PolynomialKernel(xtrain,xtrain,1))-np.sum(L) import scipy.optimize cons = ({'type': 'eq', 'fun' : lambda L: np.array([np.matmul(L.T,ytrain)]), 'jac' : lambda L: np.array([np.sum(ytrain)])}, {'type': 'ineq', 'fun' : lambda L: np.array([L]), 'jac' : lambda L: np.array([1.0])}) result=scipy.optimize.minimize(DualFunction, L,constraints=cons, method='SLSQP', options={'disp': True}) result.x 延迟都没有关系。循环。

在显示的代码中,任何地方中唯一需要#100 / begin的地方是最里面的end`循环。

答案 1 :(得分:1)

verilog中的所有4状态变量和网络都用'x'初始化。因此,在模拟中进行驱动之前,所有信号都将保持“ x”。

在测试台中,您在循环中使用#100延迟。在您的表达式中,这意味着紧随#100之后的所有分配都将在100个Verilog仿真周期(或您使用“时间标度”设置的任何值)之后发生。但是在此之前,您的所有值都将保持为“ x”。

现在,当#100触发时,您将具有以下内容:

    #100 
    a = j; <-- 0
    b = i; <-- 0
    cin = cv; <-- 0
    j = j + 1; <-- 1 << from the loop

您最终得到a = 0,b = 0,c = 0,并且j将变为'1'。

现在,您的仿真将开始并计算以上结果。您可以继续进行其余的模拟工作。

为使所有这些语句在#100之后的循环中发生,是的,您需要在它们周围添加开始/结束。否则,将仅在最内部的循环中评估第一条语句。这类似于任何编程语言。

for (j=0;j<6;j=j+1)
begin
  #100 // wait here for 100 simulation ticks
    a = j; 
    b = i; 
    cin = cv;
end