rockeric.com
学习IC验证,最前沿的消息要关注,最基础的知识也要get√。路科在坚持给大家更新来自semiengineering的分析、报道,来自DVcon的论文解读、大会进展以及一些理论性的讲解、构建,然而部分读者在后台反应期望看到一些适合新手入门的练习,能亲手动手码代码的例子。
那么这个东西能有吗?
实上已经有啦~去年路科就给大家更了Synopsys公司的一个十分适合新手的SV实验:
大象进冰箱系列
(点击链接阅读第一篇~其余篇幅关注公众号就可搜到啦~)
什么?最最忠实的你已经全部吃透啦?那不要急不要急~从今天起,小编将会开始以趣读(部分结合代码)的形式,不定期的更新一些Verilog,SystemVerilog中较为常见的编程陷阱,每一章的篇幅长短不一,结合着小编的理解和大家一起交流一起进步嘞~
· 正 · 文 · 来 · 啦 ·
在第一篇开始之前,小编先给茫然的小白做个铺垫:
首先,什么是Verilog和SystemVerilog?
Verilog是硬件描述语言(HDL),是专门用来建立数字硬件设计模型的编程语言,并在一定程度上可以编写测试程序用于测试这些模型。
SystemVerilog是对Verilog HDL的扩展,这些扩展的主要目标是用更紧凑的代码来对更大规模的设计进行建模和验证。
什么是陷阱?
这里的陷阱不是ERROR,ERROR编译器会给你找出来并且告诉你,而陷阱(gotchas)则是并没有语法错误,却会给你带来意想不到的结果。
用C语言举例说:
这句中的a=15应该是a==15的误写,但却完全符合语法,实现不了预期的效果却又不会被报错,只能让你盯着一直被执行的do_something干瞪眼呦~
那话不多说,进入今天的主题:
网表的隐式声明和默认的1bit内部网
先看下面一部分代码,这是两个1bit的加法器的连接:
看到错误了吗?没有~
编译也成功的~那跑个波形吧~(tb文件对陷阱陈述不重要未贴出)
怎么回事小老弟?
是不是有中间商赚差价(误)?
好啦不开玩笑啦~这就是今天要提到的网表的隐式赋值。事实上上面的代码这里是不一样的:
一个是c1(1234的1),一个是cl(小写的L)
事实上如果我们在程序的赋值语句的右边或左边使用未声明的标识符,编译器是会报错的~举个栗子:
连续赋值语句中,未声明的标识符写在右边也一样:
而未声明的标识符写在连续赋值语句的左边,或是用来连接一个模块、接口、程序,都会导致隐式网表类型的声明,不会报错或警告。
隐式网并不是种错误,那么当它出现后,它的大小如何确定呢?这就引出了几天我们要提的第二种陷阱,话不多说先看代码:
图中圈出的四个地方定义了co、c2的位宽,并连接了co-cl(小写L,依旧是隐式网),co-c2
对此文件编译后调出波形:
可以看出,c2被定义过,确实是4bit,而cl(小写L)虽然连接着4bit的co,但是工具在创建这一内部网时并不参考它,而是会选择生成默认的1bit内部网。大多数仿真工具会对这样的情况产生编译警告,有兴趣的IC小麋鹿们一定要自己跑一跑看看打印的信息,为避免此类陷阱,推荐对所有位宽大于1bit的内部网线及变量都进行声明。
编程陷阱在初学者中十分常见,甚至一些老手都会在不自觉中留下隐患,而只有多码多跑多踩坑多学习才能慢慢进阶成一个合格的IC从业者哦~第一篇的分享就到这儿,有什么意见或建议,欢迎在后台留言哦~另外文章所用代码点击阅读原文就可以在路科官网下载啦~
往期精彩:
2019验证VIP春季班 早鸟报名通道扫码报名稿!
二胎未生,程序员已死