繁体   English   中英

如何在 Verilog 上制作可合成的参数化编码器?

[英]How do i make a synthesizable parameterized encoder on Verilog?

我试图这样做:

module encoder 
#(
    parameter WIDTH = 4
 )
(
    input wire [WIDTH-1: 0] in,
    output reg [$clog2(WIDTH)-1: 0] out
);

  genvar i; 
  generate
    for (i = 0;i < WIDTH;i = i+1) 
    begin :gen_block
      always @* 
      begin
        if (in[i]==1'b1) 
          out = i;
      end
    end
  endgenerate
endmodule

它在模拟中效果很好,但我不确定这是否可以合成。 generate 块将生成always 块的多个副本,我猜在out的先前值和out的更新值之间会有竞争条件。

我是否正确假设无法合成此代码? 如果是这样,我该怎么做才能使其正确合成?

是的,您在模拟中确实存在竞争条件,并且它是不可合成的。 您不能让多个always块并行分配给同一个变量(在in设置多个位时发生)。 您需要一个常规的过程 for 循环,而不是 generate-for 循环。

module encoder 
#(
    parameter WIDTH = 4
 )
(
    input wire [WIDTH-1: 0] in,
    output logic [$clog2(WIDTH)-1: 0] out
);
      always_comb begin
        out = 'x; // don't care if no 'in' bits set
        for (int i = 0;i < WIDTH;i++)
            if (in[i]==1'b1) begin
               out = i;
               break; // priority goes from LSB-to-MSB
        end
    end
endmodule

编辑:对于尚不支持break的工具

always_comb begin
        bit Break;
        Break = 0;
        out = 'x; // don't care if no 'in' bits set
        for (int i = 0;i < WIDTH;i++)
            if (in[i]==1'b1 && !Break) begin
               out = i;
               Break = 1;
        end
    end

您可以通过初始化 i = N-1 来避免中断

module encoder 
#(
    parameter WIDTH = 4
 )
(
    input wire [WIDTH-1: 0] in,
    output logic [$clog2(WIDTH)-1: 0] out
);
      always_comb begin
        out = 'x; // don't care if no 'in' bits set
        for (int i = N-1 ;i >=0;i--)
            if (in[i]) begin
               out = i;
        end
    end
endmodule

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM