问题描述
我想知道如果要在不同的地址范围之间进行选择,如何使用蕴涵运算符。我正在使用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位。您应该修正自己的价值观。