Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
System verilog 对不同地址范围使用蕴涵运算符_System Verilog - Fatal编程技术网

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

System verilog 对不同地址范围使用蕴涵运算符,system-verilog,System Verilog,如果我想在不同的地址范围中进行选择,我想知道如何使用隐含运算符。我使用的是if/else条件,但约束求解器似乎不接受任何解决方案 constraint ctCopy { mode == C_CMD -> if (addr_range == "DST_SRAM") {dstAddr inside {[0:'hFFFF]}; } else if (addr_range == &

如果我想在不同的地址范围中进行选择,我想知道如何使用隐含运算符。我使用的是
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]} ;
                      }
我试图使用带有约束的
,但解算器不接受。以下是片段:

  Trn0.randomize() with { mode == C_CMD; addr_range == "DST_AHB";};
下面是要复制的小示例

class top;
  rand logic [3:0] mode;
  rand logic [16:0] dstAddr;
  rand logic [16:0] srcAddr;
  string addr_range;
  rand logic [4:0] copySize;

  constraint ctCopy { mode == 1 -> 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 == 1 -> 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 == 1 -> copySize inside {[2:10]} ;
                      }
  
endclass

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


addr\u range
的类型为
string
,这意味着它不能是
rand
变量。解决问题的一种方法是在调用“随机化”之前设置“添加范围”:

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\u range
是随机的,另一种方法是使用枚举而不是字符串



当您在操场上以Cadence运行时,它会生成有关约束中的某些值超出范围的警告消息。例如,您将
dstAddr
声明为17位值,但
'h3FFFF
至少需要18位。您应该修正您的值。

addr\u range
的类型为
string
,这意味着它不能是
rand
变量。解决问题的一种方法是在调用“随机化”之前设置“添加范围”:

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\u range
是随机的,另一种方法是使用枚举而不是字符串


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