45 lines
1.8 KiB
Systemverilog
45 lines
1.8 KiB
Systemverilog
|
||
// =============================================================
|
||
// 模块名称:oh2bin
|
||
// 功能描述:参数化 one-hot 到二进制编码器
|
||
// 参数:
|
||
// WIDTH - one-hot 输入宽度
|
||
// AREA_OPT- 1: 面积优化,0: 频率优化
|
||
// =============================================================
|
||
module oh2bin #(
|
||
parameter WIDTH = 8, // one-hot 输入宽度
|
||
parameter AREA_OPT = 1 // 1: 面积优化,0: 频率优化
|
||
)(
|
||
input logic [WIDTH-1:0] oh, // one-hot 输入
|
||
output logic [$clog2(WIDTH)-1:0] bin // 二进制输出
|
||
);
|
||
|
||
// =========================================================
|
||
// 面积优化方案:使用for循环,优先节省面积
|
||
// =========================================================
|
||
generate
|
||
if (AREA_OPT) begin : gen_area_opt
|
||
always_comb begin
|
||
bin = '0;
|
||
for (int i = 0; i < WIDTH; i++) begin
|
||
if (oh[i]) bin = i[$clog2(WIDTH)-1:0];
|
||
end
|
||
end
|
||
end else begin : gen_speed_opt
|
||
// =========================================================
|
||
// 频率优化方案:并行掩码法,参考pulp-platform/common_cells实现
|
||
// =========================================================
|
||
for (genvar j = 0; j < $clog2(WIDTH); j++) begin : gen_jl
|
||
logic [WIDTH-1:0] tmp_mask; //xinb:bin每1bit的掩码,实际上取巧了。相当于是逆向思维。还可以正向编码,待补充.
|
||
for (genvar i = 0; i < WIDTH; i++) begin : gen_il
|
||
logic [$clog2(WIDTH)-1:0] tmp_i;
|
||
assign tmp_i = i[$clog2(WIDTH)-1:0];
|
||
assign tmp_mask[i] = tmp_i[j];
|
||
end
|
||
assign bin[j] = |(tmp_mask & oh);
|
||
end
|
||
end
|
||
endgenerate
|
||
|
||
endmodule
|