barrel_shifter

我们开始逐行分析 barrel_shifter.sv,该模块用于实现多位并行移位器(Barrel Shifter),是数字硬件中常用于快速移位的结构。


🔷 第 1 行

// barrel shifter

📝 注释说明这是一个桶形移位器模块。


🔷 第 2–6 行:模块参数定义

module barrel_shifter #(
    parameter int unsigned WIDTH = 8,               // bit-width of input data
    parameter int unsigned SHIFT_WIDTH = 3,         // bit-width of shift amount
    // MODE=0-->shift left; MODE=1-->shift right
    parameter bit MODE = 1'b0
)(

🧠 参数说明:

  • WIDTH:输入操作数宽度
  • SHIFT_WIDTH:移位量的位宽(例如 3 表示最大移位量是 7)
  • MODE:移位方向控制参数(0 = 左移, 1 = 右移

SystemVerilog 支持 int unsignedbit 类型,在 Verilog 中将转换为 integerparameter + 宏定义方式。


🔷 第 7–10 行:输入输出端口定义

    input logic [WIDTH-1:0] operand_i,
    input logic [SHIFT_WIDTH-1:0] shift_amount,
    output logic [WIDTH-1:0] result_o
);

🔹 输入:

  • operand_i:待移位操作数
  • shift_amount:移位量(二进制)

🔹 输出:

  • result_o:移位结果

🔷 第 11 行:中间变量定义

logic [SHIFT_WIDTH-1:0][WIDTH-1:0] temp_results;

⚠️ SystemVerilog 的二维向量数组语法:声明一个 SHIFT_WIDTH 深度的移位过程数组,每层存储 WIDTH 位中间值。

在 Verilog 中需要改写为:

wire [WIDTH-1:0] temp_results[SHIFT_WIDTH-1:0];

🔷 第 13 行:初始化 temp_results 最后一层

assign temp_results[SHIFT_WIDTH-1] = operand_i;

表示最初的输入作为最深层的中间值,从这层逐步往上生成移位结果。


🔷 第 15–19 行:generate + genvar + 条件模式(左移)

generate
    genvar i;
    // Left Shift
    if(MODE==1'b0) begin
        for(i=SHIFT_WIDTH-1;i>0;i--) begin

这是 SystemVerilog 的 生成块(generate),用于根据参数值展开模块内部结构:

  • 如果 MODE 为 0,说明进行左移
  • 会为每一位 i 生成一个移位单元

Verilog 中将使用宏展开和 generate if / else + genvar 组合替代。


是否继续分析接下来的左移逻辑展开内容(第 20 行及以后)?还是我直接将该模块转换为 Verilog 文件供你下载?

我们继续逐行分析第 20–40 行的桶形移位器逻辑:


🔁 左移逻辑块

assign temp_results[i-1] = shift_amount[i] ? temp_results[i] << (2**i) : temp_results[i];

🧠 含义:

  • 如果移位量的第 i 位为 1,则当前值需要左移 2^i 位。
  • 否则保持原值。
  • temp_results[i] 是从上一层结果传下来的。

这种结构可以支持任意移位值的组合,例如 5'b10100 将执行左移 16 + 4。


assign result_o = shift_amount[0] ? temp_results[0] << 1 : temp_results;

🔸 最后一位(最低位)单独处理,实现最小单位的左移 1 位。

注意:这里有一个问题 —— temp_results 是二维数组,不能直接作为 assign result_o = temp_results,Verilog 中需要写 temp_results[0] 或改结构。


🔁 右移逻辑块(MODE=1)

else begin
    for(i=SHIFT_WIDTH-1;i>0;i--) begin
        assign temp_results[i-1] = shift_amount[i] ? temp_results[i] >> (2**i) : temp_results[i];
    end
    assign result_o = shift_amount[0] ? temp_results[0] >> 1 : temp_results;
end

🧠 与左移逻辑完全对称,只是改成右移 >>


🔚 generate 结束与模块收尾

endgenerate
endmodule

结束 generate 块,收尾整个 barrel_shifter 模块。


✅ 小结:结构说明

  • 本模块通过多层 temp_results 实现类似硬件中 barrel shifter 的 MUX 树结构
  • 可通过移位控制 shift_amount[i] 动态选择是否移位
  • generate if + for 是 SystemVerilog 的强大语法,Verilog 中需展开为静态结构

是否继续:
🔧 把此模块转换为 Verilog 2001 兼容版本(不使用 generate, logic, bit, parameter int 等 SystemVerilog 特性)?

posted @ 2025-05-04 15:39  江左子固  阅读(130)  评论(0)    收藏  举报