首页>参考读物>电子电工>电子工程

Verilog与SystemVerilog编程陷阱:如何避免101个常犯的编码错误
作者 : [美]斯图尔特·萨瑟兰(Stuart Sutherland) 当·米尔斯(Don Mills) 著
译者 : 戴成然 高镇 译
出版日期 : 2015-07-01
ISBN : 978-7-111-50316-3
定价 : 55.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 163
开本 : 16
原书名 : Verilog and SystemVerilog Gotchas:101 Common CodingErrors and How to Avoid Them
原出版社: Springer-Verlag
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

这本书可以工程师写出更好的Verilog / SystemVerilog的设计和验证代码,书中阐述了使用Verilog和SystemVerilog语言超过100个常见的编码错误;每一个例子详细说明了错误的症状,错误的语言规则以及正确的编码方式。这本书能帮助数字设计工程师和验证工程师有效地识别和避免这些常见的编码错误。这些错误中许多是非常微妙的,有可能需要花费几个小时或几天时间去发现或调试。

图书特色

熟悉编程的人都知道“Gotcha”这个词。“Gotcha”通常是指编程语言中那些容易被误用的优点,一旦被误用会产生意想不到的问题,在硬件设计中,可能会导致灾难性的后果和电路行为。这本书写作的初衷就是希望工程师能够写出更好的Verilog/SystemVerilog设计或者验证代码,让工程师的设计能够更快变成产品面市。

这本书论述了Verilog和SystemVerilog中超过100个常见的编程错误。每个案例都极尽细节,不仅仅包含错误的细节,还包含如果避免错误的细节。这本书帮助从事数字设计和验证相关工作的工程师提升对于常见编程错误的认知,以及如何在编程中避免再犯类似错误。这些错误中的一些可能会让工程师感到莫名其妙,而且经常要花几小时或者几天的时间去查找和排除。

与大多数讲Verilog/SystemVerilog编程语言的书相比,几乎只有少数几本会讲编程风格,几乎没有书会涉及如何认识和避免编程中的错误。这正是本书与众不同的地方。

纠错式学习,从“陷阱”中学习编程,加深对语言本身的理解。
逆向式学习,从错误中学习避免错误的方法,让读者写出更好的代码。
案例式学习,将101个“陷阱”分类汇编,以针对性案例引导读者掌握编程要点。

这本书可以帮助工程师写出更好的Verilog / SystemVerilog的设计和验证代码,书中阐述了使用Verilog和SystemVerilog语言时常犯的101个编码错误;每一个例子都详细说明了错误的症状、错误的语言规则以及正确的编码方式。这本书能帮助数字设计工程师和验证工程师有效地识别与避免这些常见的编码错误。书中列举的这些错误许多是非常微妙的,有可能需要花费几小时或几天的时间才能发现或调试。


“我中意的陷阱是‘陷阱65:死循环’。为什么呢?我为了调试这个程序缺陷付出了一个芯片的代价。相信我,当一个模型错误毁掉你的芯片时,你绝对不会忘记它是怎么发生的。可是那时我没有这本书来帮助我避免这个错误,而你有!把这本书放在你的手边,经常翻阅它,祝你的模型编译顺利,不陷入死循环。”
        ——Steve Golson, Verilog 设计咨询专家,Trilobyte Systems公司

“每周我都会收到因为客户遭遇SystemVerilog 陷阱而申请技术支持的请求,甚至经验丰富的Verilog用户在他们的代码由于棘手的端口方向问题(陷阱69)而不能编译时也会给我发电子邮件。而掌握面向对象程序设计的验证工程师由于他们的信箱充斥着错误数值(陷阱73)也会向我求助,他们可能会忘记静态代码(陷阱7、陷阱76和陷阱77),或者混淆对象和句柄(陷阱74)。为了节省你调试的时间成本,请首先参考这本书以避免这些陷阱吧。”
               ——Chris Spear,验证专家,Synopsys公司

上架指导

电子与电气工程

封底文字

这本书可以帮助工程师写出更好的Verilog / SystemVerilog的设计和验证代码,书中阐述了使用Verilog和SystemVerilog语言时超过100个常见的编码错误;每一个例子都详细说明了错误的症状、错误的语言规则以及正确的编码方式。这本书能帮助数字设计工程师和验证工程师有效地识别与避免这些常见的编码错误。书中列举的这些错误许多是非常微妙的,有可能需要花费几个小时或几天的时间才能发现或调试。


这本书中几乎每一页都会出现一个故意的代码错误。而这些代码错误是作者或者其他工程师在使用Verilog或SystemVerilog时经常犯的错误。这些错误看起来似乎没有任何问题,但是它们会引发仿真或综合的功能性错误并难以调试。并且,这些陷阱代码中的定义看起来正确,但要么不能编译,要么出现意料之外的状况。

  “我中意的陷阱是‘陷阱65:死循环’。为什么呢?我为了调试这个程序缺陷付出了一个芯片的代价。相信我,当一个模型错误毁掉你的芯片时,你绝对不会忘记它是怎么发生的。可是那时我没有这本书来帮助我避免这个错误,而你有!把这本书放在你的手边,经常翻阅它,祝你的模型编译顺利,不陷入死循环。”
        Steve Golson, Verilog 设计咨询专家,三叶虫系统公司

  “每周我都会收到因为客户遭遇SystemVerilog 陷阱而申请技术支持的请求,甚至经验丰富的Verilog用户在他们的代码由于棘手的端口方向问题(陷阱69)而不能编译时也会给我发电子邮件。而掌握面向对象程序设计的验证工程师由于他们的信箱充斥着错误数值(陷阱73)也会向我求助,他们可能会忘记静态代码(陷阱7、76和77),或者混淆对象和句柄(陷阱74)。为了节省你调试的时间成本,请首先参考这本书以避免这些陷阱吧。”
               Chris Spear,Synopsys公司,验证专家

作者简介

[美]斯图尔特·萨瑟兰(Stuart Sutherland) 当·米尔斯(Don Mills) 著:暂无简介

译者简介

戴成然 高镇 译:暂无简介

译者序

随着电子设计自动化(Electronic Design Automation,EDA)技术的广泛应用,使用硬件语言完成现场可编程门阵列(Field-Programmable Gate Array,FPGA)是大势所趋。迄今为止,主要的硬件描述语言包括VHDL、Verilog HDL和SystemVerilog。相比于后两者,VHDL发展更早,语法更为严格,因而对初学者来说上手较慢,在实际使用中经常因为不规范的代码遭遇编译报错。相比而言,Verilog及SystemVerilog具有语法灵活的优势,当然也会因这种灵活性在综合过程中产生程序员意料之外的结果。目前,相比于VHDL,Verilog和其高级版本的SystemVerilog应用更为广泛。这是因为在集成电路(Integrated Circuit,IC)设计领域,90%以上的公司都采用Verilog进行IC设计。因此对集成电路设计(Application Specific Integrated Circuit, ASIC)人员来说,必须掌握Verilog。另外,由于Verilog和C语言有很多类似的语法和关键字,鉴于C语言普及人群广泛,Verilog更能使初学者突破语言障碍,快速入门。正如我们提到的,Verilog由于其固有的灵活性,便于初学者入门。而也正因于此,过于灵活的语法经常会使工程师们陷入不当使用Verilog的陷阱,从而造成意料之外的错误。
本书是由Verilog和SystemVerilog方面的资深专家根据自身实际工程经验倾心撰写的一本实用的Verilog和SystemVerilog手册。本书给出了硬件工程师在使用Verilog和SystemVerilog时容易陷入的101个陷阱。
本书的翻译工作主要由戴成然和高镇完成,其中戴成然完成了前言和第1~4章的翻译,高镇完成了第5~8章的翻译。由于译者水平有限,文中难免出现不妥之处,敬请读者批评指正。

高 镇
2015年3月

图书目录

译者序

关于作者
第1章 什么是“编程陷阱” / 1
什么是Verilog和SystemVerilog / 1
什么是陷阱 / 1
Verilog和SystemVerilog标准 / 2
第2章 声明以及字符表述类陷阱 / 5
陷阱1:字母大小写的敏感性 / 5
陷阱2:网表的隐式声明 / 7
陷阱3:默认的1bit内部网 / 9
陷阱4:单文件和多文件编译的$unit声明 / 11
陷阱5:局部变量的声明 / 12
陷阱6:分层路径的转义名称 / 13
陷阱7:自动变量的分层引用 / 15
陷阱8:未命名模块中的变量分层引用 / 17
陷阱9:分层引用一个导入的包项目 / 19
陷阱10:从程序包中导入枚举类型 / 19
陷阱11:导入多个程序包 / 20
陷阱12:默认的整数进制 / 21
陷阱13: 有符号整数 / 23
陷阱14:有符号数的位宽扩展 / 24
陷阱15:变量位宽与赋值位宽的不一致 / 26
陷阱16:将矢量全置为1 / 27
陷阱17:合并数组和并置 / 28
陷阱18:端口连接的几点规则 / 29
陷阱19:后驱动端口 / 32
陷阱20:实型(浮点型)数字的端口间传送 / 34
第3章 RTL建模中的陷阱 / 37
陷阱21:包含函数调用的组合逻辑灵敏度列表 / 37
陷阱22:灵敏度列表中的数组 / 39
陷阱23:时序逻辑灵敏度列表中的向量 / 41
陷阱24:灵敏度列表中的操作 / 42
陷阱25:使用begin...end的时序逻辑块 / 43
陷阱26:带复位的顺序逻辑块 / 45
陷阱27:异步设置/复位触发器仿真和综合 / 46
陷阱28:顺序程序块中的阻塞赋值 / 47
陷阱29:要求阻塞赋值的顺序逻辑 / 48
陷阱30:组合逻辑中的非阻塞赋值 / 50
陷阱31:错误顺序的组合逻辑赋值语句 / 52
陷阱32:case表达式中casez/casex掩码用法 / 54
陷阱33:不完备的判决语句 / 55
陷阱34:重叠判决语句 / 58
陷阱35:不恰当使用unique 条件语句 / 59
陷阱36:2-状态模型的复位 / 61
陷阱37:枚举类型锁定状态机的建模 / 63
陷阱38:4-状态逻辑中隐藏的设计问题 / 65
陷阱39:2-状态类型中隐藏的设计问题 / 66
陷阱40:越界数组访问中的隐藏问题 / 68
陷阱41:枚举类型的越界赋值 / 69
陷阱42:模块中未检测到共享变量 / 71
陷阱43:在接口和程序包中未见共享变量 / 72
第4章 运算符陷阱 / 74
陷阱44:表达式的赋值 / 74
陷阱45:操作符的自定义和上下文定义 / 75
陷阱46:赋值语句中的运算位宽和符号扩展 / 77
陷阱47:有符号数的算数运算规则 / 80
陷阱48:基于位选择的操作 / 82
陷阱49:递增、递减和赋值运算符 / 83
陷阱50:前加与后加运算 / 84
陷阱51:一条语句中变量的多次改变 / 86
陷阱52:运算求值短路 / 86
陷阱53:逻辑非(!)与按位求反符(~) / 88
陷阱54:数组的运算 / 88
陷阱55:针对数组子集的运算 / 89
第5章 常见的编程陷阱 / 91
陷阱56:验证零时刻的异步和同步复位 / 91
陷阱57:if...else嵌套语块 / 95
陷阱 58:4-状态值下等号求值 / 96
陷阱 59:事件触发竞争条件 / 97
陷阱 60:使用信号量的同步 / 99
陷阱61:使用邮箱的同步 / 101
陷阱 62:时钟块的触发 / 103
陷阱63:判断语句后错误使用分号 / 103
陷阱 64:for循环语句中分号的错误使用 / 105
陷阱65:死循环 / 106
陷阱66:由于并发for循环引起的死锁 / 106
陷阱67:循环控制变量的引用 / 108
陷阱68:函数返回默认的位宽 / 109
陷阱69:任务/功能函数的默认值 / 110
陷阱70:为避免毛刺而采用延迟的连续赋值 / 111
第6章 面向对象和多线程编程中的陷阱 / 113
陷阱71:类定义的编程语句 / 113
陷阱72:基于面向对象接口的测试平台 / 114
陷阱73:邮箱中的所有对象具有相同的值 / 115
陷阱74:使用input或ref参数的句柄传递 / 116
陷阱75:构建一个基于对象的数组 / 117
陷阱76:静态任务和功能的非可重入性 / 118
陷阱77:静态变量与自动变量的初始化 / 119
陷阱78:叉型编程线程需要自动变量 / 121
陷阱79:禁用fork将终止多个线程 / 123
陷阱80:禁用一个语句块却未如所愿 / 124
陷阱81:仿真在测试完毕前过早退出 / 127
第7章 随机化、覆盖率和断言类陷阱 / 129
陷阱82:随机化声明的变量并未随机化 / 129
陷阱83:未被检测的随机化失败 / 130
陷阱84:$assertoff 可以禁止随机化 / 131
陷阱85:两个以上随机变量的布尔约束条件 / 133
陷阱86:不必要的负随机值 / 134
陷阱87:覆盖报告默认基于组而非箱 / 135
陷阱88:覆盖率始终报告0% / 136
陷阱89:覆盖报告将所有实例混在一起 / 138
陷阱90:覆盖组的参数方向具有粘黏性 / 138
陷阱91:断言传递语句与空成功一同执行 / 139
陷阱92:程序块中的并发断言 / 141
陷阱93:assert...else语句中的不匹配 / 142
陷阱94:不能失败的断言 / 143
第8章 工具兼容性陷阱 / 145
陷阱95:默认的仿真时间单位和精度 / 145
陷阱96:程序包链接 / 147
陷阱97:不同工具的随机数生成不一致 / 149
陷阱98:使用always_latch/always_ff来加载存储器模型 / 150
陷阱99:非标准语言扩展 / 151
陷阱100:数组常量的级联 / 153
陷阱101:传输浮点数值(实数类型)的模块端口 / 154

教学资源推荐
作者: 张英全 刘芸 樊爱华
作者: 堵国樑 主编
作者: [美]戴维·G. 阿尔恰托雷(David G. Alciatore) 迈克尔·B. 希斯坦德( Michael B. Histand) 著
参考读物推荐
作者: 彭瑜 刘亚威 王健 等编著
作者: 肖维荣 王谨秋 宋华振 编著
作者: (美)R.C. Cofer Benjamin F. Harding 著
作者: (美)James Floyd Kelly  Harold Timmis 著