对不同的地址范围使用蕴涵运算符

问题描述

我想知道如果要在不同的地址范围之间进行选择,如何使用蕴涵运算符。我正在使用StackExchange.Redis.IDatabase条件,但是约束求解器似乎对此不接受任何解决方案。

if/else

我正在尝试使用 constraint ctcopy { mode == C_CMD -> if (addr_range == "DST_SRAM") {dstAddr inside {[0:'hFFFF]}; } else if (addr_range == "DST_AXI") {dstAddr inside {['h30000:'h3FFFF]}; } else if (addr_range == "DST_AHB") {dstAddr inside {[20000:'h2FFFF]}; } else {dstAddr inside {[0:'hFFFF]}; } mode == C_CMD -> if (addr_range == "SRC_SRAM") {srcAddr inside {[0:'hFFFF]}; } else if (addr_range == "SRC_AXI") {srcAddr inside {[0:'h30000]}; } else {srcAddr inside {[0:'hFFFF]}; } mode == C_CMD -> cSize inside {[2:10]} ; } 约束,但求解器不接受。这是代码段:

with

要复制的小例子如下

  Trn0.randomize() with { mode == C_CMD; addr_range == "DST_AHB";};

自包含示例:

https://www.edaplayground.com/x/rjZy

解决方法

addr_range的类型为string,这意味着它不能是rand变量。解决问题的一种方法是在致电addr_range之前先设置randomize

module tb;
  initial begin
    top tb = new;
    tb.addr_range = "DST_AHB";
    tb.randomize() with { mode == 1; };
    $display("dstAddr=%0d,srcAddr=%0d",tb.dstAddr,tb.srcAddr);
  end
endmodule

如果您希望addr_range是随机的,另一种方法是使用枚举而不是字符串。


当您在edaplayground上使用Cadence运行时,它会生成警告消息,说明约束中的某些值超出范围。例如,您将dstAddr声明为17位值,但是'h3FFFF至少需要18位。您应该修正自己的价值观。