位宽计算的系统函数$clog2,这些是你需要知道的【Verilog高级教程】

简介: 位宽计算的系统函数$clog2,这些是你需要知道的【Verilog高级教程】

image.png


一、写在前面


本专栏为作者在 【数字IC手撕代码】 【数字IC笔试面经分享】 【数字IC工具解析】 以外开设的第四个独立专栏,旨在学习并提供有关Verilog硬件描述语言中非基础性的高阶语法特性知识,因本身专栏的独特定位,因此作者并不会涉及基础Verilog语言如阻塞式非阻塞赋值,过程块,数据类型等内容;同时受限于作者知识有限,本专栏也不会涉及System Verilog的相关内容,若按照IEEE的相关标准来看,本专栏将会聚焦Verilog-2005,即“IEEE Std 1364™-2005”以及之前的有关内容,提供相关的IC设计领域语法特性。以下为Verilog的进阶框图,有更多学习需求的读者可以检索相关英文标准进行学习。

image.png


二、什么是$clog2


$ clog2这是一个系统函数,第一次出现于Verilog-2005版本中,在IEEE中处在17.11.1节的math functions中,因为log2是2进制的对数,所以这个系统函数在电路设计的计算位宽时体现出了自身的方便性,需要注意的是,这里的$clog2是向上取整的一个系统函数,比如

$clog2(5) 虽然真实的值为2.3,但经过向上取整后,最后的输出为3


三、$clog2的优势和案例


在老的IEEE verilog版本中,假如不用clog2去计算位宽,我们可能需要如下的function函数来进行位宽计算,这个函数本身很好理解,即通过移位去检测depth的位宽,之后我们需要再将计算得到的数字使用在端口定义的过程中。

function integer clog2(
    input           integer depth
    );
begin
    if(depth == 0)
        clog2 = 1;
    else if(depth != 0)
        for(clog2 = 0; depth > 0;clog2 = clog2 + 1)
            depth = depth >> 1;
end
endfunction


但是引入$clog2后,原function可以简化为如下的过程,很显然,通过对系统函数 $clog2的使用,我们大大减少了设计时端口宽度定义时需要code的量。

module clog2(a,b);
parameter depth = 2034;
input [$clog2(depth)-1:0] a;
output [$clog2(depth)-1:0]b;
//details about the design
endmodule


四、额外补充


在Xlinix的官网的“44586 - 13.2 Verilog $clog2 function implemented improperly”中,作者发现了13.2版本的Xlinix的ISE对clog2系统函数的错误计算,按照文章中所言:“The $clog2 function returns the ceiling of the logarithm to the base e (natural logarithm) rather than the ceiling of the logarithm to the base 2.”意味着13.2版本的ISE以e为底计算clog2,而非以2为底,官方的回复是ISE 13.2 仅支持Verilog-2001,这个问题在ISE 14.1中进行了修复,所以读者假如使用的开发套件是老版本的,或者不支持Verilog-2005,都有可能因为使用clog2产生问题,需注意。具体额外补充参考如下。

44586 - 13.2 Verilog $clog2 function implemented improperly


五、其他math functions


$clog2是我们在电路设计中相当常见的一个数学相关的系统函数,IEEE也给我们提供了其他类型的系统函数,截图如下,可以发现,这些函数包括了从对数函数、指数函数、到三角函数,反三角函数的各种类型,遇到具体工程问题,读者也可以调用这些系统函数来简化验证工作。

3e9002d55c834b8a82ea91d3127443f6.png


六、往期【Verilog】高级教程文章


  • 多维数组:灭霸打个响指的功夫,看懂Verilog多维数组
  • clog2系统函数: 关于Verilog自动计算位宽的系统函数$clog2,这些是你不得不知道的
  • UDP用户原语:玩转UDP用户原语,这篇文章就够了
  • $monitor系统函数:放学前的最后几分钟,看懂Verilog中的monitor系统函数
  • generate语句:一把王者的时间,学会Verilog中的generate语句
  • parameter常量:玩转parameter与localparameter,这篇文章就够了
  • inout双向端口:通俗易懂的带你解读inout双向端口
  • task与function区别:芯片人必会的task与function区别详解
相关文章
|
19天前
|
计算机视觉
OpenCV中图像算术操作与逻辑操作
OpenCV中图像算术操作与逻辑操作
14 1
|
6天前
|
自然语言处理 Java 程序员
PL真有意思(六):子程序和控制抽象
PL真有意思(六):子程序和控制抽象
|
7月前
|
C语言 异构计算
【FPGA】Verilog 基础速览 | 数据类型 | HDL常数声明 | Timescale | 操作符 | 阻塞语句 | 非阻塞语句
【FPGA】Verilog 基础速览 | 数据类型 | HDL常数声明 | Timescale | 操作符 | 阻塞语句 | 非阻塞语句
33 0
|
12月前
|
存储 算法 异构计算
m基于FPGA的数据串并并串转换系统verilog实现,包含testbench,可以配置并行数量
m基于FPGA的数据串并并串转换系统verilog实现,包含testbench,可以配置并行数量
322 0
|
算法 异构计算
基于FPGA的直接序列扩频通信verilog设计,包括汉明编译码,扩频解扩,同步模块以及testbench
基于FPGA的直接序列扩频通信verilog设计,包括汉明编译码,扩频解扩,同步模块以及testbench
280 0
基于FPGA的直接序列扩频通信verilog设计,包括汉明编译码,扩频解扩,同步模块以及testbench
|
异构计算
FPGA(6)--7段显示译码器的加法计数器
FPGA(6)--7段显示译码器的加法计数器
197 1
FPGA(6)--7段显示译码器的加法计数器
Verilog语法入门(二)多bit逻辑门
Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发。两种HDL均为IEEE标准。
162 0
|
算法
Verilog语法入门(一)简单组合逻辑电路
Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发。两种HDL均为IEEE标准。
128 0
|
异构计算
FPGA(5)--VHDL--10十进制计数器及7段显示译码器
FPGA(5)--VHDL--10十进制计数器及7段显示译码器
619 0
FPGA(5)--VHDL--10十进制计数器及7段显示译码器
复习单片机:流水灯(内含2种方法(左移操作符法+crol法)+设计思路+原始代码)
复习单片机:流水灯(内含2种方法(左移操作符法+crol法)+设计思路+原始代码)
738 0
复习单片机:流水灯(内含2种方法(左移操作符法+crol法)+设计思路+原始代码)