为什么我的 verilog 测试台不能显示中间变量?
Why cant my verilog testbench display intermediate variables?
我想看看 a1 和 b1 中存储了什么值,但我只得到 "xxxxxx" 作为输出。为什么?
我的代码旨在获取 a 和 b 的值,它们是 4 位有符号数。如果 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
也许您可以尝试将 a1
和 b1
声明为 logic
,然后初始化它们。
因为您显示的 a1,b1 是您的 xxt 测试模块中的变量,您没有对它们进行任何操作。您可能感兴趣的 a1,b1 本地(内部) 您的 xx 模块。
此外,您在整个模块 xx 中都使用了 non-blocking 赋值,您应该在其中使用阻塞赋值。它在模拟中有效,但合成凳子会报错。
您的测试台变量和模块的范围不同。您需要 xx.a1
,并且不需要在测试平台级别声明 a1、b1。
您最好使用更通用的 'always' 和 case 语句(但这些是 style/performance/defensive,不会影响最终结果)。
我想看看 a1 和 b1 中存储了什么值,但我只得到 "xxxxxx" 作为输出。为什么?
我的代码旨在获取 a 和 b 的值,它们是 4 位有符号数。如果 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
也许您可以尝试将 a1
和 b1
声明为 logic
,然后初始化它们。
因为您显示的 a1,b1 是您的 xxt 测试模块中的变量,您没有对它们进行任何操作。您可能感兴趣的 a1,b1 本地(内部) 您的 xx 模块。
此外,您在整个模块 xx 中都使用了 non-blocking 赋值,您应该在其中使用阻塞赋值。它在模拟中有效,但合成凳子会报错。
您的测试台变量和模块的范围不同。您需要 xx.a1
,并且不需要在测试平台级别声明 a1、b1。
您最好使用更通用的 'always' 和 case 语句(但这些是 style/performance/defensive,不会影响最终结果)。