SystemVerilog测试平台外层for循环未执行问题求助
测试平台外层for循环未执行问题排查
你的测试平台代码如下:
`timescale 1 ns / 10 ps module ASS1_T3_tb(); parameter NumBits = 8; int fd; logic signed [NumBits:0] jj,kk; logic signed [2*NumBits-1:0] Output; ASS1_T3 U1(.M(jj[NumBits-1:0]), .Q(kk[NumBits-1:0]), .O(Output)); initial begin $display($time, " << Starting the Simulation >> "); for(jj=0; jj<=(8'sb11111111); jj=jj+1) begin $stop; for(kk=0; kk<=(8'sb11111111); kk=kk+1) begin #10; // Internal logic that I don't think affects the issue // this logic does NOT change jj or kk end end $finish(); end endmodule
问题原因
外层for循环直接跳过的核心原因是有符号数的比较逻辑不符合预期:
jj是9位有符号数(signed [NumBits:0]),初始值为0- 循环终止条件中的
8'sb11111111是8位有符号数,其值为**-1** - 当进行有符号数比较时,
0 <= -1的结果为假,循环体直接不执行,程序直接跳至$finish()
解决方法
方法1:强制无符号数比较
将终止条件中的常量转为无符号数,让比较逻辑按无符号数规则执行:
for(jj=0; jj <= unsigned'(8'sb11111111); jj=jj+1)
或者直接使用无符号数的最大值写法:
for(jj=0; jj <= 8'hFF; jj=jj+1)
方法2:修改变量为无符号类型
如果测试不需要处理有符号数,直接将jj和kk定义为无符号类型:
logic unsigned [NumBits:0] jj,kk;
此时8'sb11111111会被解析为无符号数255,0 <= 255为真,循环正常执行。
方法3:使用有符号数的合法范围
如果确实需要有符号数循环,将终止条件改为8位有符号数的最大值(8'sb01111111,即十进制127):
for(jj=0; jj <= 8'sb01111111; jj=jj+1)
内容的提问来源于stack exchange,提问作者cwjensen
相关产品推荐
相关产品推荐

