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

SystemVerilog约束咨询:确保读地址为已写入过的地址

解决SystemVerilog约束无法生效的问题

我来帮你分析一下问题所在,然后给出修正方案:

原代码的核心问题

  1. 地址集合未更新:你定义了aa关联数组用来记录已写地址,但从来没有把生成的w_addr添加到aa中。这导致aa.size()永远为0,约束aa.size() == 0 || aa.exists(r_addr)永远只会触发前半部分,后半部分的检查完全不起作用。
  2. 代码不完整:a.ua.push_...语句没有写完,无法正确记录已写地址。
  3. 约束逻辑漏洞:当aa为空时(第一次随机化),r_addr可以是任意值,但这不符合你“仅当r_addr此前被用作w_addr时才允许使用”的需求。

修正后的代码实现

以下是调整后的完整代码,我会逐步解释改动点:

class try;
  rand int w_addr;
  rand int r_addr;
  // 用关联数组存储已写入的地址,方便快速查找
  int written_addrs[int];

  // 约束:r_addr必须是已经写入过的地址
  constraint read_addr_valid_c {
    // 如果已有写入记录,r_addr必须存在于已写集合中
    written_addrs.size() != 0 -> written_addrs.exists(r_addr);
    // 可选:如果是第一次随机化(还没有写入记录),可以禁止生成r_addr,或者允许r_addr等于本次w_addr
    // 如果你希望第一次也能生成合法的r_addr,可以添加下面的约束(让r_addr和本次w_addr相同)
    // written_addrs.size() == 0 -> r_addr == w_addr;
  }

  // 随机化后自动记录本次的w_addr到已写集合
  function void post_randomize();
    written_addrs[w_addr] = 1; // 关联数组存任意值即可,主要用键来判断存在性
  endfunction
endclass

module test;
  try a;

  initial begin
    a = new();
    repeat(20) begin
      // 随机化,第一次如果没有开启r_addr==w_addr的约束会失败,因为没有已写地址
      if (a.randomize()) begin
        $display("Write Address: %0d", a.w_addr);
        $display("Read Address:  %0d", a.r_addr);
      end else begin
        $display("Randomization failed - no valid read address available");
      end
    end
  end
endmodule

关键改动说明

  1. 自动维护已写地址:添加post_randomize()函数,每次随机化成功后自动把当前的w_addr存入written_addrs关联数组,这样后续的随机化就能读到之前的写地址记录。
  2. 修正约束逻辑:使用隐含约束(->)替代原来的逻辑或,明确只有当已写地址集合不为空时,才要求r_addr必须存在于集合中。
  3. 可选的第一次随机化处理:如果你希望第一次随机化也能生成合法的r_addr,可以打开注释里的约束,让第一次的r_addr等于本次的w_addr(相当于刚写就读),否则第一次随机化会失败(因为没有之前的写地址)。
  4. 移除无用变量:原来的ua数组没有实际作用,所以可以删除,改用更适合查找的关联数组written_addrs。

额外优化建议

  • 如果地址范围有限(比如32位地址但实际只用到部分),可以给w_addr添加范围约束,避免生成无效地址:
    constraint w_addr_range_c {
      w_addr inside {[0:1023]}; // 示例:限制地址在0-1023之间
    }
    
  • 可以添加约束让w_addr不重复(如果需要唯一写地址):
    constraint unique_w_addr_c {
      !written_addrs.exists(w_addr);
    }
    

内容的提问来源于stack exchange,提问作者Yong Liu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:57:46