【问题标题】:How to pass signal name through $value$plusargs in system verilog如何在系统verilog中通过$value$plusargs传递信号名称
【发布时间】:2019-11-04 08:25:20
【问题描述】:

我在系统 verilog 中编写断言。此断言检查信号“lock”,该信号作为测试参数通过 switch $value$plusargs 作为 GPIO_SEL="test_bench.gpio"

所以我的代码是:

module ab 
string abc;
$value$plusargs("GPIO_SEL=%s" , abc);
reg lock;
always @* 
begin
lock = abc;
end

endmodule

这里的问题是信号锁没有像 test_bench.gpio 一样获得价值。有什么办法可以从 testplaus args 传递这个信号值

【问题讨论】:

    标签: system-verilog system-verilog-assertions


    【解决方案1】:

    SystemVerilog 是一种compiled 语言,而不是interpreted。您不能使用字符串直接访问标识符。您可以在命令行上使用编译器指令

    module ab;
    
      bit  lock;
      always_comb
          begin
       lock = `GPIO_SEL;
      end
    
    endmodule
    

    然后在编译代码时使用+define 开关

    vlog your_file.sv +define+GPIO_SEL=test_bench.gpio
    

    如果您认为重新编译您的测试平台/dut 是一个很大的负担(大多数工具提供增量编译选项),并且您有固定数量的访问路径,那么您可以使用 case 语句

    module ab 
    string abc;
    initial $value$plusargs("GPIO_SEL=%s" , abc);
    reg lock;
    always_comb
        case (abc)
          "test_bench.gpio": lock = test_bench.gpio;
          "test_bench.gpio1": lock = test_bench.gpio1;
        endcase
    
    end
    

    你可以只使用一个简单的数字而不是一个字符串来选择。

    【讨论】:

    • 我可以将这个 GPIO_SEL 作为 testplusargs 传递吗?然后使用 lock = `GPIO_SEL; ??
    • 否,$test$plusargs 和 $value$plusargs 在仿真时执行。您只能在编译时创建对信号名称的引用。如果您有一组固定的信号需要参考,您可以使用if/elsecase 语句从信号集中进行选择。
    • 我可以使用 reg 来存储这些字符串吗?例如:字符串锁 = test_bench.gpio; reg[8*22:0] lock_0;总是@* begin lock_0 = lock;结束
    • 没有。请使用 +define。
    • 还有一个查询。当我在我的测试用例中使用直接分配时,如wire lock = test_bench.gpio 它的工作但只有当我通过$value$plusargs 分配时我才面临问题。为什么会这样?
    【解决方案2】:

    看起来您需要将字符串转换为整数类型。看字符串转换函数:atoi,atobin,...

    例如

     module parg;
       string abc;
       bit [3:0] sig;
       initial begin
          $value$plusargs("GPIO_SEL=%s" , abc);
          sig = abc.atoi();
          $display("sig = %b", sig);
       end
    endmodule // parg
    

    【讨论】:

    • 感谢您的输入,但我需要在断言中使用此信号“sig”。我有以下断言代码: property check_sig ; disable iff (!sig) //添加一些检查;端属性:check_sig;那么如果我使用 atoi 转换,我可以使用上面的属性分配吗?
    • 什么阻止你在断言中使用它?该示例仅显示如何将 plusarg 值分配给信号。您可以将其扩展到您的需要。您询问了信号值。
    • 即使你提到的变化模拟不是“test_bench.gpio”的信号值
    • 对不起,我不明白你的问题了。您的示例中没有这样的信号。请提供一个可重现的示例来说明您正在尝试做的事情。
    • 我通过 valueplusargs 传递 GPIO_SEL 作为 GPIO_SEL=test_bench.gpio。现在我在我的 sv 测试用例中使用这个 GPIO_SEL 为: string pll_lock_sel ;$value$plusargs("GPIO_SEL=%s" , pll_lock_sel) ;线锁_0;分配 lock_0 = pll_lock_sel;现在这个 lock_0 信号没有得到值 test_bench.gpio。为什么会这样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多