是否可以使用Verilog生成语句来操纵信号名称?

时间:2014-06-15 21:57:09

标签: verilog

我有一个`define宏,它将1-D信号作为输入。

`define FOO(x,width) \
reg [width-1:0] total_``x; \
always@(posedge clk) begin \
   if (rst) total_``x = 'h0; \
   else     total_``x = total_``x + ``x; \
end

我有一个二维信号

reg [7:0] signal_2d [127:0];

我想在generate for语句中执行以下操作:

generate
 for (genvar i=0; i<128; i=i+1) begin
     `FOO(signal_2d[i],8);
 end
endgenerate

但由于signal_2d是一个打包数组,因此无法正常工作 是否将2-D阵列扩展为128个1-D解压缩信号?

如何根据for循环索引使用generate for循环来操作信号名称 例如,创建signal_2d _&#34; index&#34; ?

reg [7:0] signal_2d_0;
reg [7:0] signal_2d_1;
reg [7:0] signal_2d_2;
....
reg [7:0] signal_2d_127;

1 个答案:

答案 0 :(得分:1)

`define宏将在生成块之前解析,因此为宏添加i的额外输入将无济于事。调试宏也非常具有挑战性。我建议摆脱宏并使用generate循环创建的子范围来管理名称冲突。 (注意:在分配翻牌时你应该使用非阻塞(<=

genvar i;
generate
  for (i=0; i<128; i=i+1) begin : my_label
    reg [width-1:0] total_signal;
    always@(posedge clk) begin
      if (rst) total_signal <= 'h0;
      else     total_signal <= total_signal + signal_2d[i];
    end
  end
endgenerate

total_signal_2d_0将作为my_lable[0].total_signal存在,total_signal_2d_127将作为my_lable[127].total_signal存在

或者,您可以将total保留为2D数组,并将for循环移动到always块中:

reg [7:0] signal_2d [127:0];
reg [7:0] total [127:0];
integer i;
always@(posedge clk) begin
  if (rst) for(i=0;i<128;i=i+1) total[i] <= 'h0;
  else     for(i=0;i<128;i=i+1) total[i] <= total[i] + signal_2d[i];

SystemVerilog的

logic [7:0] signal_2d [128];
logic [7:0] total [128];
always_ff @(posedge clk) begin
  if (rst) total[i] <= '{ default:'0 };
  else     foreach(signal_2d[i]) total[i] <= total[i] + signal_2d[i];