首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >$rtoi()不是一个常数系统函数

$rtoi()不是一个常数系统函数
EN

Stack Overflow用户
提问于 2015-03-15 10:10:36
回答 1查看 2.7K关注 0票数 0

我想为计数器设置一个常数的大小:

代码语言:javascript
运行
复制
localparam MAX_COUNT = ((debounce_per_ms * clk_freq)) + 1;
parameter MAX_COUNT_UPPER = $rtoi($floor($log10(MAX_COUNT)/$log10(2)));

这在XST (ise)和verilator中都很适用,但在Icarus中,我得到了以下错误:

代码语言:javascript
运行
复制
src/button_deb.v:20: error: $rtoi() is not a constant system function.

我可以使用“整型”类型来解决这个问题:

代码语言:javascript
运行
复制
parameter integer MAX_COUNT_UPPER = $floor($log10(MAX_COUNT)/$log10(2));

但这给了我一个警告:

代码语言:javascript
运行
复制
$ verilator -cc src/button_deb.v
%Warning-REALCVT: src/button_deb.v:20: Implicit conversion of real to integer
%Warning-REALCVT: Use "/* verilator lint_off REALCVT */" and lint_on around source to disable this message.
%Error: Exiting due to 1 warning(s)
%Error: Command Failed /usr/local/bin/verilator_bin -cc src/button_deb.v

你认为有一个好的方法来做到这一点,并与Icarus,verilator和Xst兼容吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-15 11:16:09

$log10(MAX_COUNT)/$log10(2)是一种在没有可用log2的情况下计算log2的方法。

$log10()可用的Verilog系统中,您还应该拥有$log2()

地板上的函数是整数的整数,这样就会四舍五入。更常见的做法是,想要聚集起来,以了解覆盖该位置的比特数。

为此,我们有天花板log2 $clog2()。这并不是功能的确切替代品,因为它是向上的,而不是向下的。

示例:

代码语言:javascript
运行
复制
parameter RAM_DEPTH      = 10;
parameter RAM_ADDR_WIDTH = $clog2(RAM_DEPTH);

以下内容也应该适用于您(不需要设置整数类型):

代码语言:javascript
运行
复制
parameter MAX_COUNT_UPPER = $floor($log10(MAX_COUNT)/$log10(2));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29059457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档