我可以在verilog`define语句中使用for循环吗?

时间:2014-12-19 06:23:55

标签: loops for-loop macros verilog definition

我需要在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

会起作用吗?

1 个答案:

答案 0 :(得分:1)

我认为这个问题在很大程度上与How-to-define-a-multi-line-macro-in-verilog重复。

在这个问题中使用多行定义或任务的原因似乎是天花板log2功能,可以通过其他方式获得。

SystemVerilog&的Verilog-2005

内置$clog2()功能

的Verilog

如果$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