我有一个`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;
答案 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];