0

我想看看 a1 和 b1 中存储了什么值,但我只得到“xxxxxx”作为输出。为什么?

我的代码设计为采用 4 位有符号数字 a 和 b 的值。如果 a 或 b 的 MSB 为 1,我将使用中间变量 a1 和 b1 对这些数字进行 2 的补码,否则对我的主代码使用相同的 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
4

3 回答 3

1

您的测试台变量和模块的范围是不同的。您需要xx.a1,并且没有在测试台级别声明 a1, b1 。

您最好使用更通用的“始终”和案例陈述(但这些都是风格/性能/防御性,不会影响最终结果)。

于 2018-02-26T08:23:36.840 回答
0

因为您显示的 a1,b1 是您的 xxt 测试模块中的变量,您不对它们做任何事情。您可能感兴趣的 a1,b1 是您的 xx 模块的本地(内部) 。

此外,您在整个模块 xx 中使用非阻塞分配,您应该使用阻塞分配。它在模拟中工作,但合成凳会抱怨。

于 2018-02-26T08:21:46.603 回答
0

也许您可以尝试将a1and声明b1logic,然后对其进行初始化。

于 2018-02-26T08:08:00.937 回答