《EDA精品智汇馆 Verilog编程艺术》PDF下载

  • 购买积分:14 如何计算积分?
  • 作  者:魏家明编著
  • 出 版 社:北京:电子工业出版社
  • 出版年份:2014
  • ISBN:7121220616
  • 页数:433 页
图书介绍:

第一部分 设计原则 2

第1章 美的设计 2

1.1美学观点 2

1.2美是修养 3

1.3专业术语 4

第2章 高效之道 5

2.1敏捷开发 5

2.2代码质量 6

2.3版本控制 7

2.4提早集成 7

第3章 组织管理 9

3.1植物分类 9

3.2 SoC特性 11

3.3设计流程 12

3.4仔细规划 12

3.5管理表格 13

3.6模块层次 14

3.7目录组织 14

第4章 使用工具 19

4.1使用Emacs 19

4.1.1 Emacs介绍 19

4.1.2 Emacs安装 19

4.1.3常用快捷键 20

4.1.4我的.emacs 21

4.1.5 cua-base.el 22

4.1.6 verilog-mode.el 23

4.1.7 shell buffer 23

4.2使用Shell 24

4.2.1 Shell介绍 24

4.2.2 Shell例子 24

4.2.3 Perl例子 25

4.3使用CVS 26

4.3.1 CVS介绍 26

4.3.2 CVS术语 27

4.3.3 CVS初始化 27

4.3.4 CVS常用命令 29

第5章 编码风格 31

5.1干干净净 32

5.2代码划分 32

5.3代码要求 33

5.3.1 Venlog部分 33

5.3.2 SystemVerilog部分 40

5.4名字定义 40

5.5书写格式 42

5.5.1模块端口声名 42

5.5.2模块实例化 45

5.5.3函数和任务调用 47

5.5.4书写语句 47

5.5.5书写表达式 48

5.6添加注释 49

5.7参数化 50

5.8 lint检查 52

第二部分 语言特性 54

第6章 Verilog特性 54

6.1 Verilog标准 54

6.2抽象级别 54

6.3可综合子集 55

6.4保持一致 57

第7章 常数 58

7.1整数(integer) 58

7.2实数(real) 60

7.3字符串(string) 60

7.4标识符(identifier) 60

第8章 数据类型 61

8.1线网(net) 61

8.1.1 wire和tn 61

8.1.2 wor、wand、trior、triand 61

8.1.3 tri0、tri1 61

8.1.4 uwire 61

8.1.5 supply0、supplyl 62

8.1.6驱动强度 62

8.1.7默认net 62

8.2变量(variable) 62

8.3线网和变量的区别 63

8.4向量(vector) 64

8.5数组(array) 65

8.6多维数组 65

第9章 表达式 67

9.1操作符(Operator) 67

9.1.1操作符的优先级(Operator priority) 68

9.1.2表达式中使用整数 68

9.1.3算数操作符(Arithmetic operators) 69

9.1.4算术表达式中的regs和integers 69

9.1.5比较操作符(Compare operators) 70

9.1.6逻辑操作符(Logical operators) 70

9.1.7位运算操作符(Bitwise operators) 71

9.1.8归约操作符(Reduction operators) 71

9.1.9移位操作符(Shift operators) 71

9.1.10条件操作符(Conditional operator) 72

9.1.11连接操作符(Concatenations) 72

9.2操作数(Operands) 73

9.2.1向量的抽取(bit-select and part-select) 73

9.2.2 part-select的例子 75

9.2.3数组的访问 75

9.2.4字符串 76

9.3表达式位长(Expression bit lengths) 77

9.3.1表达式位长规则 77

9.3.2表达式位长问题的例子A 78

9.3.3表达式位长问题的例子B 79

9.3.4表达式位长问题的例子C 79

9.3.5表达式位长问题的例子D 79

9.3.6表达式位长问题的例子E 80

9.4符号表达式(Signed expressions) 80

9.4.1表达式类型规则 81

9.4.2计算表达式的步骤 81

9.4.3执行赋值的步骤 82

9.4.4 signed表达式中处理x和z 82

9.4.5 signed应用的例子 82

9.4.6 signed应用的错误 83

9.5赋值和截断(Assignments and truncation) 84

9.6与x/z比较 85

第10章 赋值操作 86

10.1连续赋值 86

10.2过程赋值 87

第11章 门级和开关级模型 88

11.1门和开关的声明语法 88

11.1.1门和开关类型 88

11.1.2驱动强度 88

11.1.3延迟 89

11.1.4实例数组 89

11.2 and、nand、nor、or、xor、xnor 90

11.3 buf、not 90

11.4 bufif1、bufif0、notif1、notif0 90

11.5 MOS switches 90

11.6 Bidirectional pass switches 91

11.7 pullup、pulldown 91

第12章 用户定义原语 92

12.1 UDP定义 92

12.1.1 UDP状态表 92

12.1.2状态表符号 93

12.2组合UDP 93

12.3电平敏感时序UDP 93

12.4沿敏感时序UDP 94

第13章 行为模型 97

13.1概览 97

13.2过程赋值 98

13.2.1阻塞赋值 98

13.2.2非阻塞赋值 99

13.3过程连续赋值 102

13.3.1 assign和deassign过程语句 103

13.3.2 force和release过程语句 103

13.4条件语句 104

13.5循环语句 105

13.5.1 for循环例子 106

13.5.2 disable语句 107

13.6过程时序控制 108

13.6.1延迟控制(Delay control) 108

13.6.2事件控制(Event control) 108

13.6.3命名事件(Named events) 109

13.6.4事件or操作符(Event or operator) 109

13.6.5隐含事件列表(Implicit event_expression list) 109

13.6.6电平敏感事件控制(Level-sensitive event control) 111

13.6.7赋值间时序控制(Intra-assignment timing controls) 111

13.7块语句 113

13.7.1顺序块(Sequential block) 113

13.7.2并行块(Parallel block) 114

13.7.3块名字(Block names) 114

13.7.4开始和结束时间(Start and finish times) 114

13.8结构化过程 116

13.8.1 initial construct 116

13.8.2 always construct 116

13.8.3 always的敏感列表 117

13.8.4并发进程 117

13.9 always有关的问题 118

13.9.1敏感列表不完整 118

13.9.2赋值顺序错误 119

第14章 case语句 120

14.1 case语句定义 121

14.2 case语句的执行 122

14.3 Verilog和VHDL对比 123

14.4 case的应用 123

14.5 casez的应用 125

14.6描述状态机 126

14.7 casex的误用 127

14.8 casez的误用 128

14.9 full case和parallel_case 128

14.10 full case 129

14.10.1不是full的case语句 129

14.10.2是full的case语句 129

14.10.3使用full case综合指令 130

14.10.4 full case综合指令的缺点 131

14.10.5使用full case指令后还是生成Latch 132

14.11 paralle_ase 132

14.11.1不是parallel的case语句 132

14.11.2是parallel的case语句 133

14.11.3使用parallel case综合指令 133

14.11.4 parallel case综合指令的缺点 134

14.11.5没有必要的parallel case指令 135

14.12综合时的警告 135

14.13 case语句的编码原则 136

第15章 task和function 137

15.1 task和function之间的不同点 137

15.2 task的声明和使能 137

15.2.1 task的声明 137

15.2.2 task的使能和参数传递 138

15.2.3 task的内存使用和并发进程 140

15.3 disable语句 141

15.3.1 disable语句的例子A 141

15.3.2 disable语句的例子B 143

15.4 function的声明和调用 145

15.4.1 function的声明 145

15.4.2 function的返回值 147

15.4.3 function的调用 147

15.4.4 function的规则 147

15.4.5 constant function 148

15.5 task的误用 149

15.6 function的误用 149

第16章 调度和赋值 151

16.1仿真过程 151

16.2事件仿真 151

16.3仿真参考模型 152

16.4分层事件队列 153

16.4.1事件队列分类 154

16.4.2事件队列特性 155

16.4.3事件调度例子 155

16.5确定性和不确定性 157

16.5.1确定性(Determinism) 157

16.5.2不确定性(Nondeterminism) 157

16.6赋值的调度含义 158

16.6.1连续赋值 159

16.6.2过程连续赋值 159

16.6.3阻塞赋值 159

16.6.4非阻塞赋值 159

16.6.5开关处理 159

16.6.6端口连接 159

16.6.7任务和函数 160

16.7阻塞赋值和非阻塞赋值 160

16.7.1阻塞赋值 160

16.7.2非阻塞赋值 161

16.8赋值使用原则 161

16.9自己触发自己 162

16.10仿真零延迟RTL模型 163

16.11惯性延迟和传输延迟 165

16.11.1门级仿真中的传输延迟 166

16.11.2各种#delay的位置 168

16.11.3仿真时钟生成方法 169

16.12延迟线模型 170

16.13使用#1延迟 171

16.14多个公共时钟和竞争条件 172

16.15 避免混杂阻塞赋值和非阻塞赋值 173

16.16 RTL和门级混合仿真 176

16.16.1 RTL-to-Gates仿真 177

16.16.2 Gates-to-RTL仿真 177

16.16.3有时钟偏差的门级时钟树 178

16.16.4有时钟偏差的Vendor模型 178

16.16.5错误的Vendor模型 179

16.16.6结论和建议 183

16.17带有SDF延迟的门级仿真 183

16.17.1全系统仿真 183

16.17.2软件要花钱 184

16.17.3门级回归仿真 184

16.18验证平台技巧 185

16.18.1在0时刻复位 186

16.18.2时钟沿之后复位 186

16.18.3创建仿真时钟 186

16.18.4在无效沿输入激励 187

第17章 层次结构 188

17.1模块 188

17.1.1模块定义 188

17.1.2模块实例 188

17.2参数 188

17.2.1参数声明 189

17.2.2参数调整 189

17.2.3参数传递 190

17.2.4参数依赖 192

17.2.5内部参数 193

17.2.6 clog2 193

17.2.7指数** 194

17.3端口 194

17.3.1端口声明 194

17.3.2端口连接 195

17.3.3实数传递 196

17.4 Generate语句 196

17.4.1 Loop generate construct 197

17.4.2 Conditional generate construct 200

17.5实例数组 201

17.6层次名字 203

第18章 系统任务和函数 205

18.1显示任务 205

18.1.1显示和写出任务 205

18.1.2探测任务 208

18.1.3监控任务 209

18.2文件读写 209

18.2.1打开和关闭文件 209

18.2.2文件输出 211

18.2.3字符串输出 212

18.2.4文件输入 213

18.2.5文件定位 216

18.2.6刷新输出 216

18.2.7错误状态 216

18.2.8检查文件尾部 217

18.2.9加载文件数据 217

18.3时间比例 218

18.3.1 $printtimescale 218

18.3.2 $timeformat 218

18.4仿真控制 218

18.4.1 $finish 218

18.4.2 $stop 218

18.5仿真时间 218

18.6转换函数 219

18.7概率分布 220

18.7.1 $random 220

18.7.2 $dist functions 220

18.8命令行输入 220

18.8.1 $test$plusargs 221

18.8.2 $value$plusargs 221

18.9数学运算 223

18.9.1整数函数 223

18.9.2实数函数 223

18.10波形记录 224

第19章 编译指令 225

19.1 ?celldefine和?endcelldefine 225

19.2 ?default_nettype 225

19.3 ?define和?undef 226

19.4 ?ifdef、?else、?elsif、?endif、?ifndef 227

19.5 ?include 228

19.6 ?resetall 228

19.7 ?line 228

19.8 ?timescale 229

19.9 ?unconnected drive和?nounconnected drive 230

19.10 ?begin_keywords和?end_keywords 230

19.11 ?pragma 230

第20章 Specify块 231

20.1 specify块声明 231

20.2 speparam 231

20.3模块路径声明 232

20.3.1模块路径要求 232

20.3.2简单路径 232

20.3.3沿敏感路径 233

20.3.4状态依赖路径 234

20.4模块路径延迟 235

第21章 时序检查 237

21.1概览 237

21.2使用稳定窗口的时序检查 237

21.2.1 $setup、$hold、$setuphold 238

21.2.2 $recovery、$removal、$recrem 238

21.3时钟和控制信号的时序检查 240

21.3.1 $skew、$timeskew、$fullskew 240

21.3.2 $width 240

21.3.3 $period 241

21.3.4 $nocbange 241

21.4使用notifier响应时序违反 241

21.5使用条件事件 242

21.6时序检查中的Vector 243

21.7 Negative timing check 243

第22章 反标SDF 246

22.1 SDF标注器 246

22.2 SDF construct到Verilog的映射 246

22.2.1 SDF路径延迟到Verilog的映射 246

22.2.2 SDF时序检查到Verilog的映射 247

22.2.3 SDF互连延迟的标注 248

22.3 $sdf_annotate 249

22.4 SDF文件例子 250

第23章 编程语言接口 252

23.1 DirectC 252

23.2 SystemVerilog 252

第24章 综合指令 253

24.1 Synopsys综合指令 253

24.2使用综合指令 253

24.3使用translate_off/on 254

24.4误用translate_off/on 256

24.5使用attribute 256

第三部分 书写文档 260

第25章 书写文档 260

25.1文档格式 260

25.2定义文档 261

25.3应用文档 262

25.4设计文档 262

25.5备份文档 263

25.6 GPIO设计 263

第26章 GPIO应用文档 264

26.1 Overview 264

26.2 Register Description 264

26.2.1 PIN Level Register(PIN) 265

26.2.2 Data Register(DAT) 265

26.2.3 Data Set Register(DATS) 265

26.2.4 Data Clear Register(DATC) 265

26.2.5 Mask Register(IM) 266

26.2.6 Mask Set Register(IMS) 266

26.2.7 Mask Clear Register(IMC) 266

26.2.8 PULL Enable Register(PEN) 266

26.2.9 PEN Enable Set Register Register(PENS) 266

26.2.10 PEN Enable Clear Register Register(PENC) 266

26.2.11 PSEL Select Register(PSEL) 266

26.2.12 PSEL Enable Set Register Register(PSELS) 266

26.2.13 PSEL Enable Clear Register Register(PSELC) 267

26.2.14 Function Register(FUN) 267

26.2.15 Function Set Register(FUNS) 267

26.2.16 Function Clear Register(FUNC) 267

26.2.17 Select Register(SEL) 267

26.2.18 Select Set Register(SELS) 267

26.2.19 Select Clear Register(SELC) 267

26.2.20 Direction Register(DIR) 267

26.2.21 Direction Set Register(DIRS) 268

26.2.22 Direction Clear Register(DIRC) 268

26.2.23 Trigger Register(TRG) 268

26.2.24 Trigger Set Register(TRGS) 268

26.2.25 Trigger Clear Register(TRGC) 268

26.2.26 FLAG Register(FLG) 268

26.2.27 FLAG Clear Register(FLGC) 269

26.3 Program Guide 269

26.3.1 GPIO Function Guide 269

26.3.2 Alternate Function Guide 269

26.3.3 Interrupt Function Guide 269

26.3.4 Disable Interrupt Function Guide 270

第27章 GPIO设计文档 271

27.1文件列表(见表27-1) 271

27.2端口列表(见表27-2) 271

27.3配置参数(见表27-3) 272

第四部分 高级设计 274

第28章 使用IP 274

28.1 Cadence的IP 274

28.2 Cadence的VIP 275

28.3 Synopsys的IP 275

28.4 DesignWare Building Block 276

28.5在FPGA上使用DesignWare 276

第29章 代码优化 278

29.1代码可读 278

29.2简洁编码 279

29.3优化逻辑 281

29.4优化迟到信号 281

29.5括号控制结构 282

第30章 状态机设计 283

30.1状态机类型 283

30.2状态编码方式 283

30.3二进制编码FSM 284

30.3.1两个always块 284

30.3.2重要的编码规则 285

30.3.3错误状态的转换 285

30.3.4 next的默认值 285

30.4独热码编码FSM 286

30.5寄存器输出 287

第31章 可配置设计 289

31.1格雷码转换 289

31.2通用串行CRC 290

31.2.1 general_crc.v 290

31.2.2 testbench 292

31.3 FIFO控制器 293

31.4 RAM Wrapper例子 296

31.4.1常规方法 296

31.4.2名字规范化 297

31.4.3 RFl_wrapper.v 298

31.4.4 gen_wrapper.pl 302

31.4.5 ram_def.txt例子 306

31.4.6生成wrapper 307

31.5可配置的GPIO设计 308

31.5.1 gpio.v 308

31.5.2 gpio_params.v 317

31.5.3 gpio_check.v 317

31.5.4 gpio_reg.v 318

31.5.5 gpio_sync.v 319

31.6可配置的BusMatrix 320

31.6.1 BusMatrix简介 320

31.6.2设计ABM 321

31.6.3 mini abm 322

31.6.4 large-abm 331

31.7可配置的Andes Core N801 333

31.8可配置的ARM926EJS 334

31.9灵活的coreConsultant 336

第32章 可测性设计 337

32.1内部扫描 337

32.2内建自测 339

32.3边界扫描 340

第五部分 时钟和复位 342

第33章 异步时序 342

33.1亚稳态 342

33.2 MTBF 343

33.3同步器 344

33.3.1电平同步器 344

33.3.2边沿检测同步器 345

33.3.3脉冲检测同步器 345

33.4同步多位数据 347

33.5异步FIFO 348

33.6 Design Ware 348

33.7 DW_fifoctl_s2_sf 349

33.8门级仿真 351

第34章 时钟生成 352

34.1同步电路 352

34.2设计原则 353

34.3分频器 353

34.3.1 1/n分频器 353

34.3.2 n/d分频器 355

34.4时钟切换 355

34.5时钟生成 358

第35章 时钟例子 362

35.1 Overview 362

35.2 CGU Clock 362

35.2.1 Clock List 362

35.2.2 Clock Diagram(见图35-1) 363

35.2.3 Clock Divider Rate(见表35-1) 364

35.3 Register Description(见表35-2) 364

35.3.1 CGU PLL Divider Register(CGU_PDR) 364

35.3.2 CGU Counter Regsister(CGU_CNT) 365

35.3.3 CGU PLL Control Register(CGU_PCR) 365

35.3.4 CGU Low Power Control Register(CGU_LPC) 365

35.3.5 CGU Status Register(CGU_CST) 365

35.3.6 CGU Divider 0 Register(CGU_DV0→1/s) 366

35.3.7 CGU Divider 1 Register(CGU_DV1→1/x) 366

35.3.8 CGU Divider 2 Register(CGU_DV2→1/n) 366

35.3.9 CGU Divider 3 Register(CGU_DV3→1/n) 367

35.3.10 CGU Divider 4/5/6/7 Register(CGU_DV4/5/6/7→n/d) 367

35.3.11 CGU Divider 8 Register(CGU_DV8→n/d) 367

35.3.12 CGU Divider 9 Register(CGU_DV9→n/d) 367

35.3.13 CGU Module Stop 0 Register(CGU_MS0) 367

35.3.14 CGU Module Stop 1 Register(CGU_MS1) 368

35.3.15 CGU Module Stop 2 Register(CGU_MS2) 368

35.3.16 CGU Reset Control Register(CGU_RCR) 369

35.3.17 CGU Reset Status Register(CGU_RST) 369

35.4 PLL Structure 369

35.4.1 Frequency Calculation 370

35.4.2 VCO Frequency Limitation 370

35.4.3 PFD Clock Frequency Limitation 370

35.5 PLL Control 371

35.6 Sleep and Wakeup 371

35.6.1 State switch 371

35.6.2 How to wakeup 372

35.7 Module Stop 372

35.8 Application Notes 373

第36章 复位设计 374

36.1复位的用途 374

36.2寄存器编码风格 374

36.2.1有/无同步复位寄存器 374

36.2.2寄存器推导原则 376

36.3同步复位 376

36.3.1编码风格和电路 377

36.3.2同步复位的优点 378

36.3.3同步复位的缺点 379

36.4异步复位 379

36.4.1编码风格和电路 380

36.4.2既有异步复位又有异步置位的寄存器 380

36.4.3异步复位的优点 381

36.4.4异步复位的缺点 382

36.5异步复位的问题 382

36.5.1复位recovery时间 383

36.5.2复位撤销经历不同的时钟周期 383

36.6复位同步器 383

36.6.1复位同步器有亚稳态吗? 384

36.6.2错误的ASIC Vendor模型 385

36.6.3有缺点的复位同步器 385

36.6.4复位时的仿真验证 386

36.7复位分布树 387

36.7.1同步复位分布技巧 389

36.7.2异步复位分布技巧 389

36.7.3复位分布树的时序分析 390

36.8复位毛刺的过滤 391

36.9异步复位的DFT 391

36.10多时钟复位的问题 392

36.10.1非协调的复位撤销 392

36.10.2顺序协调的复位撤销 393

36.11结论 394

第六部分 验证之路 396

第37章 验证之路 396

37.1整洁验证 397

37.2验证目标 398

37.3验证流程 398

37.4验证计划 398

37.5随机验证 399

37.6直接验证 399

37.7白盒验证 399

37.8模块验证 400

37.9系统验证 400

37.9.1验证重点 400

37.9.2验证环境 401

37.9.3 IP互连 401

37.9.4性能验证 401

37.10 DFT验证 402

37.11网表验证 402

37.12高级抽象 403

37.13灵活验证 405

37.14 ARM926EJS的Validation环境 406

37.14.1 Validation tools 407

37.14.2 Validation configuration files 407

37.14.3 Validation test suites 407

37.14.4 Validation flow 408

37.14.5 Building the model 408

37.14.6 Running Validation test suites 408

37.14.7 Debugging a single Validation test 410

37.15 AHB BusMatrix的验证 411

37.16某芯片的SoC验证环境 411

第七部分 其他介绍 414

第38章 SystemVerilog特性 414

38.1 SystemVerilog与Systemc比较 414

38.2 SystemVerilog的特点 414

38.3新的数据类型 415

38.3.1整型和实型 415

38.3.2新的操作符 416

38.3.3数组 416

38.3.4队列 417

38.3.5枚举类型 417

38.3.6结构体和共同体 417

38.4 always comb、always_latch和always_ff 417

38.5 unique和priority 418

38.6 loop、break和continue 419

38.7 task和function 419

38.7.1静态和自动作用域 419

38.7.2参数传递 420

38.7.3参数中的默认值 420

38.8 Port connection 421

38.9 Tag 421

38.10 Interface 422

38.11 class和object 425

38.11.1对象的概念 425

38.11.2类的创建 426

38.11.3类的继承 427

38.11.4类的randomize 428

38.11.5类的cover group 429

38.12 VMM、OVM和UVM 429

参考文献 431

关于版权 432