-1

我正在使用定义宏来设置模块的路径,即`define DUT_PATH(CH) dut_top.u_channel_```CH``_mode

并在我们传递通道号的模块中使用这个定义宏,

模块 channel_oper # (int channel_num = 0) ( 输入逻辑 addr_base; ) ;

分配 addr_base = `DUT_PATH(channel_num).addr_base ;

端模块

在顶部文件中,我们将模块称为

通道操作(3);//channel_oper(channel_num)

我希望 addr_base 的输出为 dut_top.u_channel_3_mode.addr_base,但我得到的值分配为 dut_top.u_channel_channel_num _mode.addr_base和交叉取消引用错误。

您能否为此提供一个解决方案或任何建议,以使用定义宏的参数化变量。

在这种情况下,无法使用 genvar 或 generate 块,因为它不用于任何操作。这用于访问不同通道号的不同路径,我们从顶部模块传递通道号。模块通道操作从参数中获取通道号,然后转到该特定通道路径并获取变量。

4

1 回答 1

1

这是一个可以在某些情况下工作的示例(在 synopsys vcs/system verilog 中工作)。它为每个通道生成一个实例名称,但形式略有不同。它会自动从循环迭代中插入 [num],并为“if”语句插入一个额外的层次结构,我将其命名为“number”。您还需要知道正确组织循环的最大通道数。

module top;
   mod#(1) mod1();
   mod#(4) mod2();
endmodule // top

module mod#(int P = 0);
   for (genvar i = 0; i < 10; i++) begin: channel
      if (i == P) begin:number
        mx mx();
      end
   end
endmodule

module mx;
   initial
     $display("%m");
   initial #2 $finish;
endmodule // mx

现在,这里是“mx”实例的列表:

top.mod1.channel[1].number.mx
top.mod2.channel[4].number.mx
于 2018-08-22T15:40:16.827 回答