Verilog испытательный стенд для цикла (приоритет, проблема со значением) - PullRequest
0 голосов
/ 02 декабря 2018

Для i=0 и j=0 этот код делает мои a,b,cin and s сигналы равными xxxxxxxx.

Для i=0 и j=1 мои a,b,cin and s равны 00000000 .Whichдолжен быть результат для моего сумматора для 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 голосов
/ 02 декабря 2018

Все переменные и сети с 4 состояниями в verilog инициализируются с помощью «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
0 голосов
/ 02 декабря 2018

Задание задержки #100 до или после назначения не имеет значения, если вы понимаете, как работает задержка в цикле.

Требуется только begin / end в любом месте в показанном вами коде с самым внутренним for(j=0; `циклом.

...