我有一个希望使用递归的verilog代码。但是,每当我在一个总是块中尝试这个时,它都会给出一个错误,说不是任务。
有什么方法可以在 always 块中实现模块?还有无论如何我可以在 always 块中使用递归吗?
您可以使用生成块编写递归模块:
module unary_and
#(parameter WIDTH = 32)
(input [WIDTH-1:0] in_and,
output out_and)
generate
if(WIDTH == 1) begin
assign out_and = in_and;
end
else if(WIDTH == 2) begin
assign out_and = in_and[0] & in_and[1];
end
else begin
unary_and #(.WIDTH (WIDTH/2))
unary_and_low
(.in_and (in_and[WIDTH/2-1:0]),
.out_and (out_and_low));
unary_and #(.WIDTH (WIDTH - WIDTH/2))
unary_and_high
(.in_and (in_and[WIDTH-1:WIDTH/2]),
.out_and (out_and_high));
assign out_and = out_and_low & out_and_high;
end
endgenerate
endmodule
这是来自Verilog中的递归和迭代设计,您也可以在其中找到其他解决方案。您也可以查看递归模块。
也许你也应该看看这些问题和答案:
我们可以在一个 always 块中生成吗?
始终块中的 Verilog 生成/genvar