ras*_*124 3 parameters for-loop verilog hdl
我在Verilog中设计一些硬件,但为了保持灵活性,我使用参数来设置宽度,这样我就可以根据需要修改宽度而无需修改代码.我遇到的一个问题是在一段代码中我希望能够并行写入多个单元格.
parameter DATA_WIDTH = 16;
parameter BUFFER_SIZE = 16;
parameter LOAD_WIDTH = DATA_WIDTH*BUFFER_SIZE;
input [LOAD_WIDTH-1:0] i_load_data;
reg [DATA_WIDTH-1:0] r_data_buf[BUFFER_SIZE-1:0];
...
always@(posedge clk) begin
....
else if (i_load_flag) begin
for(i = 0; i < BUFFER_SIZE; i = i + 1)
r_data_buf[i] <= i_load_data[i * BUFFER_SIZE + BUFFER_SIZE - 1:i * BUFFER_SIZE];
end
end
Run Code Online (Sandbox Code Playgroud)
我需要将r_data_buf保留为数组,因为必须读取数据的方式.我也不清楚为什么verilog不喜欢这个代码,因为在编译时一切都是常量,或者我如何修复它并仍然得到我想要的行为.
Verilog编译器不高兴,因为它看到i_load_data [x:y],其中x和y都依赖于参数,所以担心这可能导致宽度变化(尽管在你的情况下是不可能的).
有几种简单的方法可以解决这个问题:
使用+:运算符指定宽度.(我还将BUFFER_SIZE更改为DATA_WIDTH,因为这看起来像是一个错字.)在这种形式中,您可以给出LSB的索引和您想要选择的数据的宽度.
r_data_buf[i] <= i_load_data[i * DATA_WIDTH +: DATA_WIDTH];
Run Code Online (Sandbox Code Playgroud)使用额外的for循环分别设置每个位
for(i = 0; i < BUFFER_SIZE; i = i + 1)
begin
for(j = 0; j < DATA_WIDTH; j = j + 1)
begin
r_data_buf[i][j] <= i_load_data[i * DATA_WIDTH + j];
end
end
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
6113 次 |
| 最近记录: |