Logic Verilog参数化热编码器
我觉得有点尴尬,因为我觉得这很容易写 一个固定宽度的热编码器很容易用case语句编写。但我正在绞尽脑汁试图写一个参数化的N位单热编码器。到目前为止,我已经:Logic Verilog参数化热编码器,logic,verilog,system-verilog,Logic,Verilog,System Verilog,我觉得有点尴尬,因为我觉得这很容易写 一个固定宽度的热编码器很容易用case语句编写。但我正在绞尽脑汁试图写一个参数化的N位单热编码器。到目前为止,我已经: module onehot_enc #( parameter WIDTH ) ( input logic [WIDTH-1:0] in, input logic [$clog2(WIDTH-1:0] out ); genvar i; generate for(i = 0; i < WIDTH; i++) begin
module onehot_enc #(
parameter WIDTH
) (
input logic [WIDTH-1:0] in,
input logic [$clog2(WIDTH-1:0] out
);
genvar i;
generate
for(i = 0; i < WIDTH; i++) begin
assign out |= in[i] ? i : 0;
end
endgenerate
endmodule
模块onehot\u enc#(
参数宽度
) (
输入逻辑[WIDTH-1:0]输入,
输入逻辑[$clog2(宽度-1:0]输出
);
genvar i;
生成
对于(i=0;i
但显然“|=”不是运算符
有人对写这篇文章有什么建议吗?在我的脑海里,这似乎很简单…你肯定需要一个循环。这里不应该使用生成块。encider可以在always块中实现 因为您在示例中使用了“logic”,所以我假设这里的system verilog语法是正确的。因此,请添加“system verilog”标记 在下面的示例中,循环在没有任何“中断”的情况下运行整个迭代集以使其可合成。因此,在本例中,最后的“1”获胜。第一个
out=0
语句将默认值“0”指定给“out”。它还使代码组合。否则它将是一个锁存器
module onehot_enc #(
parameter WIDTH = 1
) (
input logic [WIDTH-1:0] in,
output logic [$clog2(WIDTH)-1:0] out
);
always_comb begin
out = 0;
for (int i = 0; i < WIDTH; i++) begin
if (in[i])
out = i;
end
end
endmodule
模块onehot\u enc#(
参数宽度=1
) (
输入逻辑[WIDTH-1:0]输入,
输出逻辑[$clog2(宽度)-1:0]输出
);
总是从梳子开始
out=0;
对于(int i=0;i
您肯定需要一个循环。此处不应使用generate块。encider可以在always块中实现
因为您在示例中使用了“logic”,所以我假设这里的system verilog语法是正确的。因此,请添加“system verilog”标记
在下面的示例中,循环在没有任何“中断”的情况下运行整个迭代集以使其可合成。因此,在本例中,最后的“1”获胜。第一个out=0
语句将默认值“0”指定给“out”。它还使代码组合。否则它将是一个锁存器
module onehot_enc #(
parameter WIDTH = 1
) (
input logic [WIDTH-1:0] in,
output logic [$clog2(WIDTH)-1:0] out
);
always_comb begin
out = 0;
for (int i = 0; i < WIDTH; i++) begin
if (in[i])
out = i;
end
end
endmodule
模块onehot\u enc#(
参数宽度=1
) (
输入逻辑[WIDTH-1:0]输入,
输出逻辑[$clog2(宽度)-1:0]输出
);
总是从梳子开始
out=0;
对于(int i=0;i
谢谢。有没有办法向合成器提示这是一个热点?因为即使不是一个热点,这段代码也会运行?不确定。使用此条件可能会有所帮助:if(out==0&&in[i]==1)
或使用标志if(!found&&in[i])begin…found=1;end
这也将使第一场比赛获胜。谢谢。有没有办法给合成器一个提示,这是一个热点?因为即使不是热点,这段代码也会运行?不确定。使用此条件可能会有所帮助:如果(out==0&&in[i]==1)
或者使用标志如果(!found&&in[i])begin…found=1;end
它还将使第一场比赛获胜。