Logic Verilog参数化热编码器

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

我觉得有点尴尬,因为我觉得这很容易写

一个固定宽度的热编码器很容易用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
    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
它还将使第一场比赛获胜。