SystemVerilog:从参数派生输入宽度

时间:2015-06-18 17:03:29

标签: verilog system-verilog hdl

我有一个输入,其宽度我想在精化时确定。我想要确定从单个参数派生的宽度,而不是提供两个参数。像这样:

module my_module #(
  COUNT = 9
) (
  [bitwidth(COUNT)-1:0] index
);

如果我在模块中声明了一个reg内部函数,我有一个适用于我的函数但是我需要通过端口映射从外部驱动它。

function integer bitwidth;
  input integer n;
  integer exp2, width;
begin
  width=1;
  for (exp2=1; exp2<<1 <= n; exp2=exp2<<1)
    width=width+1;
  bitwidth = width;
end
endfunction

reg [bitwidth(COUNT)-1:0] this_works = COUNT;

我如何做到这一点?我可以利用界面(+ modports)来获取我想要的东西吗?

1 个答案:

答案 0 :(得分:0)

显示一个完整的自包含示例真的很有帮助。以下为我工作

module my_module #(
  COUNT = 9
) (
  [bitwidth(COUNT)-1:0] index
);
function integer bitwidth;
  input integer n;
  integer exp2, width;
begin
  width=1;
  for (exp2=1; exp2<<1 <= n; exp2=exp2<<1)
    width=width+1;
  bitwidth = width;
end
endfunction
   initial $displayb(index);
endmodule
module top;
   my_module #(10) mm();
endmodule

如果我们假设$ clog2不存在,那么有关此代码的几条评论。

  • 永远不要依赖隐式端口方向和类型,要明确 清晰度和表现意图。
  • 使用ANSI样式参数列表。
  • 使用int代替integer

module my_module #( COUNT = 9 ) ( input wire [bitwidth(COUNT)-1:0] index ); function integer bitwidth(input int n); int width; width=1; for (int exp2=1; exp2<<1 <= n; exp2=exp2<<1) width=width+1; bitwidth = width; endfunction initial $displayb(index); endmodule module top; my_module #(10) mm(); endmodule