【问题标题】:two-variable macro usage systemverilog二元宏使用系统verilog
【发布时间】:2017-02-07 09:26:18
【问题描述】:

我已经搜索了网络,但找不到我的问题的答案。我正在尝试在 systemverilog 中使用双变量宏。

在一个文件中,我声明了以下宏:

`define TX_TOP_PATH(first_idx,second_idx)  aaa.F[first_idx].bbb.S[second_idx].ccc

在第二个文件中(在一个模块中),我尝试使用这个宏来生成嵌套的 for 循环。例如:

wire if[15:0];
generate
    for (first_idx = 1; first_idx< 4; first_idx++)    
    begin : first_loop
       for (second_idx = 0; second_idx < 4; second_idx++)
       begin : second_loop
          assign if[4*first_idx + second_idx].clk = `TX_TOP_PATH(first_idx,second_idx).clk;
       end
    end
endgenerate

但是当我这样做时,我得到了错误 - CUVFGS: "Invalid for-generate index"。

当我尝试将宏定义放在括号中时,如下所示:

`define TX_TOP_PATH(first_idx,second_idx)  (aaa.F[first_idx].bbb.S[second_idx].ccc)

我收到错误 - EXPSMC:“需要分号 (';')”

有什么想法吗?

利亚夫

【问题讨论】:

    标签: macros system-verilog


    【解决方案1】:

    我认为你有两个问题:

    i) if 是保留字。你不能打电话给你的wireif

    ii) 您需要将first_idxsecond_idx 都声明为genvar

      wire iif[15:0];    // "if" is a reserved word
    
      generate
        genvar first_idx, second_idx;    // these need to be declared as genvars
        for (first_idx = 1; first_idx< 4; first_idx++)    
        begin : first_loop
           for (second_idx = 0; second_idx < 4; second_idx++)
           begin : second_loop
             assign iif[4*first_idx + second_idx] = `TX_TOP_PATH(first_idx,second_idx).clk;
           end
        end
      endgenerate
    

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

    【讨论】:

    • 好吧,我的例子并不准确。电线名称实际上不是“if”,而是类似于“dut_if”,所以这不是问题。关于 genvar,你是对的,我实际上对两个索引都使用了 genvar,但我忘了在这里复制它。仍然无法正常工作:(
    • 那我觉得你需要发一个MCVE,从一开始这总是一个好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多