【问题标题】:Systemverilog: Is there a way to make signal unique in macro instantiating a module?Systemverilog:有没有办法在宏实例化模块时使信号唯一?
【发布时间】:2016-02-05 14:26:51
【问题描述】:

我有一个这样的宏:

`define BOB_STAGE(_BUS_IN, _BUS_OUT) \
   bob_module auto_``_BUS_OUT``_bob_module ( .bus_in(_BUS_IN), .bus_out(_BUS_OUT) );

(注意 _BUS_OUT 成为实例名称的一部分以创建唯一实例。)

所以这些在所有地方都被使用,并将连接的信号输入到 1 个信号输出,但输出信号被索引。

使用示例:

`BOB_STAGE( {A,B,C,D}, OUT[1] );

问题在于 concat {} 和 index [] 都搞乱了模块实例名称中的自动分配。

我想在不为信号名称添加另一个输入并且在宏外部没有临时信号的情况下解决这个问题。

有没有办法将带有索引的输出信号名称转换为唯一的字符串...例如使用 $sformatf 然后用下划线替换索引括号?

或者是否有其他方法可以统一信号名称但保持合法?像 atoi() 之类的东西可以根据信号名称使其成为唯一编号?

【问题讨论】:

    标签: string macros verilog system-verilog


    【解决方案1】:

    您可以转义名称以允许标识符中的符号

    `define BOB_STAGE(_BUS_IN, _BUS_OUT) \
       bob_module \auto_``_BUS_OUT``_bob_module ( .bus_in(_BUS_IN), .bus_out(_BUS_OUT) );
    
    `BOB_STAGE( {A,B,C,D}, OUT[1] );
    

    会变成

    bob_module \auto_OUT[1]_bob_module ( .bus_in(_BUS_IN), .bus_out(_BUS_OUT) );
    

    这实际上是您在 SystemVerilog 中创建标识符所能做的限制。

    【讨论】:

    • 我不确定您所说的“转义名称”是什么意思
    • 参见 1800-2012 LRM 的 5.6.1 转义标识符部分
    • 这适用于 RTL。谢谢。 (不确定实施工具会喜欢它,但这是另一场战斗)
    【解决方案2】:

    您可以在宏中再添加一个参数来解决问题。

    您的宏可能如下所示:

    `define BOB_STAGE(_BUS_IN, _BUS_OUT, _NO) \
       bob_module auto_``_BUS_OUT``_``_NO``_bob_module ( .bus_in(_BUS_IN), .bus_out(_BUS_OUT[_NO]) );
    

    现在您的宏用法将如下所示:

    `BOB_STAGE( {A,B,C,D}, OUT, 1 );
    

    【讨论】:

    • 谢谢,但我说我想要一个不添加参数的解决方案。
    • @user5888527 :我相信,没有其他选择,因为宏只替换文本,与传递的参数完全相同。
    • 我不相信。应该有一些方法可以通过就地字符串操作来做到这一点。我只是不太精通verilog的非合成方面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    相关资源
    最近更新 更多