parameters - 在 verilog 中使用带有 for 循环的参数进行位选择

标签 parameters for-loop verilog hdl

我正在用 Verilog 设计一些硬件,但为了保持灵 active ,我使用参数来设置宽度,这样我就可以根据需要修改宽度,而无需修改代码。我遇到的一个问题是在一段代码中我希望能够并行写入多个单元格。

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

由于必须读取数据的方式,我需要将 r_data_buf 保存为一个数组。我也不清楚为什么 verilog 不喜欢这段代码,因为在编译时一切都是常量,或者我如何修复它并仍然获得我想要的行为。

最佳答案

Verilog 编译器不高兴,因为它看到 i_load_data[x:y],其中 x 和 y 都取决于参数,所以它担心这可能会导致宽度发生变化(尽管在您的情况下这是不可能的)。

有几个简单的方法可以解决这个问题:

  1. 使用 +: 运算符指定宽度。 (我还将 BUFFER_SIZE 更改为 DATA_WIDTH,因为这看起来像是一个拼写错误。)在这种形式中,您给出了 LSB 的索引和您希望选择的数据的宽度。

    r_data_buf[i] <= i_load_data[i * DATA_WIDTH  +: DATA_WIDTH];
    
  2. 使用额外的 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
    

关于parameters - 在 verilog 中使用带有 for 循环的参数进行位选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10093880/

相关文章:

linux - 如何使用 getopts 创建标志以在 linux 中运行 mount 命令?

C++循环直到输入特定字符

vhdl - 如何在 FPGA 中实现无限循环?

vhdl - 是否可以设计一个基于锁存器的 FIFO 而不是 FF?

powershell - 通过 PowerShell 脚本 (.ps1) 上的快捷方式传递参数

c - 为什么没有参数的函数(与实际函数定义相比)可以编译?

java - 如何在Java中使用For循环询问用户输入

java - 如何在表中编写行索引和列索引(java) - 嵌套for循环

arrays - 何时使用 tick(') 进行 Verilog 数组初始化?

c# - Saxon XSLT 传递参数