reaction100 发表于 2013-2-17 21:23:07

[Verilog] 怎样自动定义参数的位宽?

本帖最后由 reaction100 于 2013-2-17 21:37 编辑

写串口模块的时候遇到的问题:


系统时钟频率是50MHz,串口波特率要求是9600
为了便于使用,模块的开始部分使用这样的语句:
parameter DELAY = 50_000_000 / 9600;
(或者 `define DELAY 50_000_000 / 9600 )

如果时钟改为100MHz,波特率改为38400,参数就能改为
parameter DELAY = 100_000_000 / 38400;


这样使用虽然方便了,但是不同的参数位数不同,下文使用的时候就会出现warning
warning虽然不影响使用,但总是不好看。
如果模块后面的计数器部分也用默认的32位,虽然没有warning,但会浪费资源,因此不是个好办法。
请问有什么办法能方便使用,而且不产生warning?




tangkuan660 发表于 2013-2-19 15:10:25

在模块的module后面增加位宽变量,可以到调用该模块的上级对该位宽变量进行重新赋值,顺便把你上面提到的变量一起引到上层,一起修改就可以了。

dr2001 发表于 2013-2-19 15:27:18

文件最后添加:/*Get How Many Bits is Required to Represent 0 or 0 to V-1: (V <= 2) ? 1 : $clog2(V)*/
function integer CGetW(input V); reg i;
begin CGetW = 1; for(i = 0; (1 << i) < V; i = i + 1) CGetW = 1 + i; end endfunction
用parameter,宽度调用这个函数,函数的参数是值。Google一下就能得到。

$clog2也可以用,但是特殊值有问题,另外一个是部分综合器支持的不好;不如自己的常数Function。

reaction100 发表于 2013-3-3 20:53:16

dr2001 发表于 2013-2-19 15:27 static/image/common/back.gif
文件最后添加:用parameter,宽度调用这个函数,函数的参数是值。Google一下就能得到。

$clog2也可以用, ...

非常感谢!

nnimo 发表于 2013-3-5 15:10:22

dr2001的方法可靠些!顶!

蓝色风暴@FPGA 发表于 2013-6-3 18:37:03

dr2001 发表于 2013-2-19 15:27 static/image/common/back.gif
文件最后添加:用parameter,宽度调用这个函数,函数的参数是值。Google一下就能得到。

$clog2也可以用, ...

纠结了几天的问题,居然在这里找到了方法,非常感谢!

skyxjh 发表于 2013-6-4 13:03:40

function bitw;
input value;
reg i = 0;
while((1<<i) < value) i = i + 1;
bitw = i;
endfunction
页: [1]
查看完整版本: [Verilog] 怎样自动定义参数的位宽?