[英]How to create decimal array parameter with width set by another parameter?
我的模塊具有信號sensor_line[WIDTH-1:0]
的可配置寬度輸入,其中WIDTH
是參數。 對於每個sensor_line
,我都有一個記錄器模塊,在for
循環中用generate
塊實例化。 我需要將一個十進制數參數傳遞給這個記錄器,每個sensor_line
都不同。
我需要創建一些十進制數組參數以提供給頂部的模塊,它的寬度將與WIDTH
參數對齊。 我不介意是否需要自己匹配給定的數組大小,只要在實例化我的模塊時可以從頂部開始匹配即可。
在尋找解決方案時,我發現只能傳遞一個位數組(二進制值)。 例如,要為每個sensor_line
傳遞 5 位,可以使用如下代碼:
module my_module #(
parameter WIDTH = 4, // number of input lines
parameter [4:0] CYCELS [WIDTH-1:0] = '{ WIDTH{5'b0}}
)
(
Input clk;
input [WIDTH-1:0] sensor_line;
…
);
logic [WIDTH-1:0] sensor_line_out;
…
genvar i;
generate
for (i=0; i< WIDTH; i=i+1) begin : sensor_sync
recorder #(
. CYCELS(CYCELS [(i+1)*5:i*5])
)
recorder_instance(
.in(sensor_line[i]),
.out(sensor_line_out[i]),
.clk(clk),
…
);
end
endgenerate
…
endmodule
我如何將十進制值傳遞給記錄器模塊,而不是示例中的位,例如在 C 中傳遞 integer 數組,然后指向索引 [i] 處的數組,最后實例我的模塊如下所示:
my_module #(
.WIDTH(4), // number of input lines
.CYCELS([2,3,5,4])
) my_module_1 (
...
)
my_module #(
.WIDTH(3), // number of input lines
.CYCELS([3,2,2])
) my_module_2 (
...
)
您用來傳遞十進制值數組的語法不正確。 例如,更改:
.CYCELS([2,3,5,4])
到:
.CYCELS('{2,3,5,4}) // an assignment pattern
或者
.CYCELS({2,3,5,4}) // an unpacked array concatenation
這是編譯的實際代碼:
module my_module #(
parameter WIDTH = 4, // number of input lines
parameter [4:0] CYCELS [WIDTH-1:0] = '{default:'0}
);
for (genvar i=0; i< WIDTH; i++) begin : sensor_sync
initial $display("%m CYCELS[%0d]=%0d", i, CYCELS[i]);
end
endmodule
module top;
my_module #(
.WIDTH(4), // number of input lines
.CYCELS('{2,3,5,4})
) my_module_1 (
);
my_module #(
.WIDTH(3), // number of input lines
.CYCELS('{3,2,2})
) my_module_2 (
);
endmodule
Output:
top.my_module_1.sensor_sync[0] CYCELS[0]=4
top.my_module_1.sensor_sync[1] CYCELS[1]=5
top.my_module_1.sensor_sync[2] CYCELS[2]=3
top.my_module_1.sensor_sync[3] CYCELS[3]=2
top.my_module_2.sensor_sync[0] CYCELS[0]=2
top.my_module_2.sensor_sync[1] CYCELS[1]=2
top.my_module_2.sensor_sync[2] CYCELS[2]=3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.