[英]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.