我需要在verilog宏中包含一个相当复杂的计算。我可以在宏定义中使用for循环吗?下面给出了我的代码
的示例`define CLOGB2(depth) \
integer width \
for(width=0;depth>0;width=width+1) \
depth = depth >> 1; \
return width
module test #(parameter MEMDEPTH = 16)
(
// Input-output port declaration
);
parameter MEMWIDTH = `CLOGB2(MEMDEPTH);
$display("Calculated width : %d\n",MEMWIDTH);
...
...
endmodule
会起作用吗?
答案 0 :(得分:1)
我认为这个问题在很大程度上与How-to-define-a-multi-line-macro-in-verilog重复。
在这个问题中使用多行定义或任务的原因似乎是天花板log2功能,可以通过其他方式获得。
内置$clog2()
功能
如果$clog2
不可用,请包含您自己的功能可能更简单:
function integer CLog2;
input [31:0] depth;
integer i;
begin
i = depth;
for(CLog2 = 0; i > 0; CLog2 = CLog2 + 1)
i = i >> 1;
end
endfunction