先放函数,已验证和$clog2输出一致,注意需满足输入n ≥ 1。

// 返回以2为底的n的对数
function integer clog2 (input integer n); beginn = n - 1;for (clog2 = 0; n > 0; clog2 = clog2 + 1)n = n >> 1;
end
endfunction

另外,经评论区提醒,在Vivado 2017以后的版本中,可以直接使用系统函数$clog2(),不需要去自编函数了。后续又测试了Quartus 18.1 同样支持$clog2(),各位可自行测试使用的工具是否支持$clog2()。

一.为什么需要以2为底n的对数的函数

在Verilog编写代码过程中,经常需要根据一个常量来定义一个变量的位宽,例如,要编写一个计数器,计数最大值为常量N,那么计数变量cnt的位宽应该是多少呢?这个问题在SV可利用系统函数$clog2来解决,如下:

module counter
#(parameter CNT_MAX = 1023
)(output logic cnt_finish,input  logic clk,input  logic rstn
);logic [$clog2(CNT_MAX+1)-1 : 0] cnt;
always_ff @(posedge clk, negedge rstn) beginif (~rstn)cnt <= '0;else if (cnt < CNT_MAX)cnt <= cnt + 1'b1;elsecnt <= '0;
endassign cnt_finish = cnt == CNT_MAX;endmodule

但是在Verilog中没有这个系统函数,所以需要自行编写。

二.Verilog编写求以2为底n的对数的函数

将上面计数器的SV代码改为Verilog,用自编的clog2替代SV的系统函数$clog2

module counter
#(parameter CNT_MAX = 1023
)(output wire cnt_finish,input  wire clk,input  wire rstn
);reg [clog2(CNT_MAX+1)-1 : 0] cnt;
always @(posedge clk, negedge rstn) beginif (~rstn)cnt <= 'd0;else if (cnt < CNT_MAX)cnt <= cnt + 1'b1;elsecnt <= 'd0;
endassign cnt_finish = cnt == CNT_MAX;// 以2为底的对数函数
function integer clog2 (input integer n); beginn = n - 1;for (clog2 = 0; n > 0; clog2 = clog2 + 1)n = n >> 1;
end
endfunctionendmodule

三.仿真验证

仿真验证自编函数clog2的输出和SV系统函数$clog2的输出是否一致,仿真工具:modelsim SE-64 2020.4,testbench(try_tb.sv)如下:

module try_tb();timeunit 1ns;
timeprecision 10ps;initial beginfor (integer i=1; i<1025; i++) begin$display("$clog(%d) = %d,   clog2(%d) = %d", i, $clog2(i), i, clog2(i));end
end// 以2为底的对数函数
function integer clog2 (input integer n); beginn = n - 1;for (clog2 = 0; n > 0; clog2 = clog2 + 1)n = n >> 1;
end
endfunctionendmodule

部分仿真结果:

可见,clog2(n) 与 $clog2(n) 输出一致。

Verilog自编函数clog2替代SV中的系统函数$clog2相关推荐

  1. java中函数的调用,java中如何调用函数

    java动态调用函数,Java 中使用动态代码,java函数调用,java中如何调用函数 如何在 Java 中调用 C 函数 宗薇 [期刊名称]<网络新媒体技术> [年(卷),期]2000 ...

  2. matlab 子函数怎么写,matlab中怎么写函数

    1.matlab怎么写函数文件~ 1.首先在电脑中打开baimatlab软件. 2.在打开的页面中点击"du主页"栏目下的"新建"按钮.zhi 3.然后在打开的 ...

  3. python中lambda函数if用法-Python中关于Lambda函数的使用总结

    lambda表达式是一种匿名函数,对应python中的自定义函数def,是定义某个函数时比较高级的一种写法.作为python初学者,本文整理了lambda的一些基本用法和特点. lambda和def的 ...

  4. python中编函数_在python中编写函数

    Aaron Hall.. 10 递归实现 这是一个相当优雅的递归实现,为了清晰起见,它使用了Python 3的功能: def strict_compose(*funcs): *funcs, penul ...

  5. 关于Verilog中readmemb系统函数

    Verilog读取txt文本数据** Warning:(vsim-PLI-3409) Illegal binary digit ' 时间 :2022 / 6 / 09 今天在使用readmemb过程中 ...

  6. matlab messagebox函数,[MATLAB]在C#中引用MATLAB函数

    环境:VS2017+MATLAB R2017a ①打开上次我们生成的BPClass.cs文件(目录:~//bin/BP/for_testing),得在C#程序中引用生成的dll文件(目录:~//bin ...

  7. 【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | DexFile 构造函数及相关调用函数 | Android 源码中查找 native 函数 )

    文章目录 一.DexFile 构造函数 二.DexFile.openInMemoryDexFile 函数 三.Android 源码中查找 native 函数 一.DexFile 构造函数 上一篇博客 ...

  8. pythonjoin函数所在包_Python中的join()函数

    在本文中,我们将学习如何Join()在Python 3.x中实现功能.或更早. 让我们看看可迭代列表上最通用的实现.在这里,我们通过定界符连接列表的元素.分隔符可以是任何字符,也可以不是. 示例# i ...

  9. php中系统函数的特征,php 常用的系统函数

    字符串函数 strlen:获取字符串长度,字节长度 substr_count 某字符串出现的次数 substr:字符串截取,获取字符串(按照字节进行截取) mb_strlen mb_substr st ...

最新文章

  1. tcpdump抓包文件提取http附加资源
  2. ecshop $user
  3. 字符串之单词原地逆转
  4. [Everyday Mathematics]20150221
  5. TomcatServlet笔记
  6. Java IO: 序列化与ObjectInputStream、ObjectOutputStream
  7. C#.Net使用线程池(ThreadPool)与专用线程(Thread)
  8. 电力系统潮流计算程序 matlab,大神们,求个电力系统潮流计算的matlab程序。
  9. 组合数学 —— 基本计数原理
  10. git 报错 Repository Not Found
  11. YOLO学习笔记——第三篇YOLOv3(含FPN网络解析)
  12. 管理运筹学教程_期末复习_总结笔记
  13. Java使用蔡勒公式快速计算某一天是星期几
  14. 8法则的挑战:长尾理论与长尾效应
  15. 物联网毕设选题 - 单片机智能红外测温系统(物联网 stm32 远程wifi)
  16. 政务系统信息网络安全的风险评估
  17. 苹果怎么测是原装屏_Wendy在华强北教你组装苹果8P——屏幕
  18. android视频动态壁纸app,短视频动态壁纸转换
  19. 停课不停学,腾讯云助力在线教育!
  20. 微信小程序:智力考验看成语猜古诗句好玩解闷小游戏下载

热门文章

  1. uva5984(简单计算几何)
  2. crtsiii型无砟轨道板_为什么高铁轨道不像普快列车轨道那样铺碎石?
  3. python 分析两组数据的差异_R语言limma包差异基因分析(两组或两组以上)
  4. mysql group_concat去重_Mysql下GROUP_CONCAT使用
  5. 2020-10-13 四元数用法(不讲原理,只讲计算规则)
  6. 如何执行超过一百兆(100MB)的sql脚本?
  7. 20162316刘诚昊 《程序设计与数据结构》 第三周学习总结
  8. 又一次的Microsoft Visual C++ 10.0 is required (Unable to find vcvarsall.bat)
  9. Linux 进程管理器 supervixor
  10. 男士美容,这些方面你做了没? - 生活至上,美容至尚!