You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:01:09