2014-06-15 35 views
0

我有一個`define宏,它將一維信號作爲輸入。是否可以使用Verilog生成語句來操作信號名稱?

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

我有一個2-d信號

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

我想執行下列操作,生成聲明:

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解包信號的選項?

如何根據循環索引使用generate for loop來操作信號名稱。
例如,創建signal_2d_「索引」?

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

`define宏將解決之前生成塊,因此增加額外的輸入i於宏也無濟於事。宏也是非常具有挑戰性的調試。我建議擺脫宏,並使用由生成循環創建的子範圍來管理名稱衝突。 (注:你應該使用非阻塞(<=)分配觸發器時)

genvar i; 
generate 
    for (i=0; i<128; i=i+1) begin : my_label 
    reg [width-1:0] total_signal; 
    [email protected](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_signaltotal_signal_2d_127將存在爲my_lable[127].total_signal

或者,你可以保持總爲一個二維數組和移動for循環的總塊內:

reg [7:0] signal_2d [127:0]; 
reg [7:0] total [127:0]; 
integer i; 
[email protected](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]; 
+0

非常感謝摩根 – user3743044

相關問題