Почему мой тестовый стенд Verilog не отображает промежуточные переменные?

Я хочу посмотреть, какое значение хранится в a1 и b1, но в качестве вывода я получаю только «xxxxxx». Почему?

Мой код предназначен для приема значений a и b, которые являются 4-битными числами со знаком. Я использую промежуточные переменные a1 и b1, чтобы сделать 2 дополнения этих чисел, если старший бит a или b равен 1, в противном случае используйте те же самые a и b для моего основного кода. Но я не могу получить промежуточные значения.

Соответствующий код и тестовый стенд;

module xx(a,b,z);
    input   signed [3:0] a,b;
    output  signed [7:0] z;
    integer i;
    wire w1,w2,w3,w4,w5,w6,w7,w8,w9,w10,w11,w12;    
    reg [3:0] pp0,pp1,pp2,pp3;
    reg [3:0] a1,b1;

   always @ (a or b)  begin  
      if ( a[3] == 1 && b[3] == 1) begin
          a1 <= ~a + 1;
          b1 <= ~b + 1;
      end else if ( a[3] == 1 && b[3] == 0) begin
          a1 <= ~a + 1;
          b1 <=b;
      end else if ( a[3] == 0 && b[3] == 1) begin
          a1 <= a;
          b1 <= ~b + 1;
      end else begin
          a1 <= a;
          b1 <= b;
      end
   end
.....
endmodule

Испытательный стенд

module xxt();
    reg  signed [3:0]a,b;
    wire  signed [7:0]z;
    reg [3:0] a1,b1; 

    xx w1(a,b,z);

    integer i;
    integer j;

    initial
    begin
        for ( i = 0; i<16; i = i + 1)
        begin
            for ( j = 16; j>0; j = j - 1)
            begin
                #10 b=j; a=i;
                //$display("a*b=z %d %d %d", a, b, z);
                //$display("a*b=z %b %b %b", a, b, z);
                $display("%t\ta\tb\ta1\tb1\tz\n\t\t%b\t%b\t%b\t%b\t%b", $time, a, b, a1, b1, z);
                $display("%t\t%d\t%d\t%d\t%d\t%d", $time, a, b, a1, b1, z);
            end
        end
    end


endmodule

В моей стенограмме отображается только это

 10 a   b   a1  b1  z
#       0000    0000    xxxx    xxxx    xxxxxxxx
#                   10    0   0  x   x     x
#                   20  a   b   a1  b1  z
#       0000    1111    xxxx    xxxx    xxxxxxxx
#                   20    0  -1  x   x     x
#                   30  a   b   a1  b1  z
#       0000    1110    xxxx    xxxx    00000000
#                   30    0  -2  x   x     0
#                   40  a   b   a1  b1  z
#       0000    1101    xxxx    xxxx    00000000
#                   40    0  -3  x   x     0
#                   50  a   b   a1  b1  z
#       0000    1100    xxxx    xxxx    00000000
#                   50    0  -4  x   x     0
#                   60  a   b   a1  b1  z
#       0000    1011    xxxx    xxxx    00000000
#                   60    0  -5  x   x     0
#                   70  a   b   a1  b1  z
#       0000    1010    xxxx    xxxx    00000000
#                   70    0  -6  x   x     0
#                   80  a   b   a1  b1  z
#       0000    1001    xxxx    xxxx    00000000
#                   80    0  -7  x   x     0
#                   90  a   b   a1  b1  z
#       0000    1000    xxxx    xxxx    00000000
#                   90    0  -8  x   x     0
#                  100  a   b   a1  b1  z
#       0000    0111    xxxx    xxxx    00000000
#                  100    0   7  x   x     0
#                  110  a   b   a1  b1  z
#       0000    0110    xxxx    xxxx    00000000
#                  110    0   6  x   x     0
#                  120  a   b   a1  b1  z
#       0000    0101    xxxx    xxxx    00000000
#                  120    0   5  x   x     0
#                  130  a   b   a1  b1  z
#       0000    0100    xxxx    xxxx    00000000
#                  130    0   4  x   x     0
#                  140  a   b   a1  b1  z
#       0000    0011    xxxx    xxxx    00000000
#                  140    0   3  x   x     0
#                  150  a   b   a1  b1  z
#       0000    0010    xxxx    xxxx    00000000
#                  150    0   2  x   x     0
#                  160  a   b   a1  b1  z
#       0000    0001    xxxx    xxxx    00000000
#                  160    0   1  x   x     0
....

and so on

person Raveen Kumar    schedule 26.02.2018    source источник


Ответы (3)


Объем ваших переменных тестового стенда и модуля различны. Вам нужно xx.a1 и не объявлять a1, b1 на уровне тестового стенда.

Вам также было бы лучше использовать более общее «всегда» и оператор case (но это стиль/производительность/защита и не повлияет на конечный результат).

person Sean Houlihane    schedule 26.02.2018
comment
Спасибо. Моя проблема была решена путем добавления w1 перед a1 и b1. '$display(%t\t%d\t%d\t%d\t%d\t%d, $time, a, b, w1.a1, w1.b1, z);' Но все же мое дополнение 2 неверно. - person Raveen Kumar; 26.02.2018
comment
Мы здесь не для того, чтобы отлаживать ваш дизайн... Попробуйте переписать его как оператор case, посмотрите, не облегчит ли это отладку. - person Sean Houlihane; 26.02.2018

Возможно, вы могли бы попытаться объявить a1 и b1 как logic, а затем инициализировать их.

person nick_g    schedule 26.02.2018

Потому что отображаемые вами a1, b1 являются переменной в вашем тестовом модуле xxt, и вы ничего с ними не делаете. Возможно, интересующие вас a1,b1 находятся локально (внутри) вашего модуля xx.

Также вы используете неблокирующее присваивание по всему модулю xx, где вы должны использовать блокирующие. Это работает в симуляции, но стул для синтеза будет жаловаться.

person Oldfart    schedule 26.02.2018
comment
Спасибо. Но как мне отобразить мои a1 и b1 в окне стенограммы или в форме волны? - person Raveen Kumar; 26.02.2018