如何在 FPGA 中综合这段代码?这也可以在 ASIC 中综合吗?

问题描述 投票:0回答:1

module model #(parameter
  DATA_WIDTH=32
) (
  input [DATA_WIDTH-1:0] din,
  output logic dout
);
logic [$clog2(DATA_WIDTH):0] accum;

int i;
assign dout = (din[0] ~^ din[DATA_WIDTH-1]);
always_comb begin
    for(i = 1; i < (DATA_WIDTH+1)/2 ; i++) begin
        assign dout = dout & (din[i] ~^ din[DATA_WIDTH-1-i]);
    end
end

endmodule

这是回文位验证的代码,它看起来无法与递归组合 doout 合成

我只是感到困惑和好奇,有人能解释一下吗?我应该只使用宏来扩展吗

assign dout = (din[0] ~^ din[DATA_WIDTH-1]) & (din[1] ~^ din[DATA_WIDTH-2]) & ... ;
verilog system-verilog
1个回答
0
投票

首先,你不能在always块中使用分配。

assign dout = dout & [some logic];

其次,这是不可综合的,因为这会在组合电路中创建反馈。

您可以通过输入位迭代always_comb块来检查回文属性。使用带有 if 语句的 for 循环可确保逻辑保持可综合性,如下所示:

module model #(
  parameter DATA_WIDTH=32
) (
  input [DATA_WIDTH-1:0] din,
  output logic dout
);

integer i;

always_comb begin
    dout = 1;
    for (i = 0; i < (DATA_WIDTH + 1) / 2; i++) begin
        if (din[i] !== din[DATA_WIDTH-1-i]) begin
            dout = 0;
        end
    end
end

endmodule
© www.soinside.com 2019 - 2024. All rights reserved.