下
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]) & ... ;
首先,你不能在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