【发布时间】:2014-06-24 15:24:50
【问题描述】:
我想在一个时钟进程中生成一些语句,如下所示:
parameter C_INPUT_LENGTH = 32;
parameter C_OUTPUT_NUM_BITS = 5;
reg [C_OUTPUT_NUM_BITS-1:0] address;
reg [C_INPUT_LENGTH-1:0] vector_i;
always@(posedge clk) begin
if(rst) begin
address <= 0;
end
else begin
if (vector_i[0] == 1) begin
address <= 0;
end
if (vector_i[1] == 1) begin
address <= 1;
end
...
if (vector_i[C_INPUT_LENGTH-1] == 1) begin
address <= C_INPUT_LENGTH-1;
end
end
end // always@ (posedge clk)
我是这样做的:
integer forcount;
always@(posedge clk) begin
if(rst) begin
address <= 0;
end
else begin
for (forcount = 0;forcount <= C_INPUT_LENGTH-1 ;forcount = forcount + 1) begin
if (vector_i[forcount] == 1) begin <--
address <= forcount;
end
end
end
end // always@ (posedge clk)
Xilinx vivado (2014.1) 给出以下错误,参考上面指出的行:
[Synth 8-903] failed to generate logic
我在过去使用类似的方法之前已经这样做了,它已经奏效了,我做错了什么?如何生成这些 if 语句?
【问题讨论】:
-
合成工具展开循环。根据
C_INPUT_LENGTH的值和您的时钟周期时间限制,展开的逻辑可能不适合一个时钟周期。您是否尝试过增加时钟周期时间或减少C_INPUT_LENGTH? -
@Ari 即使 for 循环不适合单个时钟周期,也不会阻止它进行合成。
-
另外,您可能想尝试分离组合逻辑块和顺序逻辑块。我会将 for 循环放在一个 always_comb 块中,并将其输出分配给
always和(@posedge clk)中的address。看起来你想在单个周期中找到第一个 1 位,无论如何这是一个组合逻辑。 -
见这里:forums.xilinx.com/xlnx/board/…。尝试:
if (vector_i[forcount] == 1'b1)而不是if (vector_i[forcount] == 1) -
@ari 你指的是什么组合代码?一切都在一个 always 块中。
标签: verilog