内容简介
第一部分 设计原则
第1章 美的设计
1.1美学观点
1.2美是修养
1.3专业术语
第2章 高效之道
2.1敏捷开发
2.2代码质量
2.3版本控制
2.4提早集成
第3章 组织管理
3.1植物分类
3.2 SoC特性
3.3设计流程
3.4仔细规划
3.5管理表格
3.6模块层次
3.7目录组织
第4章 使用工具
4.1使用Emacs
4.1.1 Emacs介绍
4.1.2 Emacs安装
4.1.3常用快捷键
4.1.4我的.emacs
4.1.5 cua-base.el
4.1.6 verilog-mode.el
4.1.7 shell buffer
4.2使用Shell
4.2.1 Shell介绍
4.2.2 Shell例子
4.2.3 Perl例子
4.3使用CVS
4.3.1 CVS介绍
4.3.2 CVS术语
4.3.3 CVS初始化
4.3.4 CVS常用命令
第5章 编码风格
5.1干干净净
5.2代码划分
5.3代码要求
5.3.1 Venlog部分
5.3.2 SystemVerilog部分
5.4名字定义
5.5书写格式
5.5.1模块端口声名
5.5.2模块实例化
5.5.3函数和任务调用
5.5.4书写语句
5.5.5书写表达式
5.6添加注释
5.7参数化
5.8 lint检查
第二部分 语言特性
第6章 Verilog特性
6.1 Verilog标准
6.2抽象级别
6.3可综合子集
6.4保持一致
第7章 常数
7.1整数(integer)
7.2实数(real)
7.3字符串(string)
7.4标识符(identifier)
第8章 数据类型
8.1线网(net)
8.1.1 wire和tn
8.1.2 wor、wand、trior、triand
8.1.3 tri0、tri1
8.1.4 uwire
8.1.5 supply0、supplyl
8.1.6驱动强度
8.1.7默认net
8.2变量(variable)
8.3线网和变量的区别
8.4向量(vector)
8.5数组(array)
8.6多维数组
第9章 表达式
9.1操作符(Operator)
9.1.1操作符的优先级(Operator priority)
9.1.2表达式中使用整数
9.1.3算数操作符(Arithmetic operators)
9.1.4算术表达式中的regs和integers
9.1.5比较操作符(Compare operators)
9.1.6逻辑操作符(Logical operators)
9.1.7位运算操作符(Bitwise operators)
9.1.8归约操作符(Reduction operators)
9.1.9移位操作符(Shift operators)
9.1.10条件操作符(Conditional operator)
9.1.11连接操作符(Concatenations)
9.2操作数(Operands)
9.2.1向量的抽取(bit-select and part-select)
9.2.2 part-select的例子
9.2.3数组的访问
9.2.4字符串
9.3表达式位长(Expression bit lengths)
9.3.1表达式位长规则
9.3.2表达式位长问题的例子A
9.3.3表达式位长问题的例子B
9.3.4表达式位长问题的例子C
9.3.5表达式位长问题的例子D
9.3.6表达式位长问题的例子E
9.4符号表达式(Signed expressions)
9.4.1表达式类型规则
9.4.2计算表达式的步骤
9.4.3执行赋值的步骤
9.4.4 signed表达式中处理x和z
9.4.5 signed应用的例子
9.4.6 signed应用的错误
9.5赋值和截断(Assignments and truncation)
9.6与x/z比较
第10章 赋值操作
10.1连续赋值
10.2过程赋值
第11章 门级和开关级模型
11.1门和开关的声明语法
11.1.1门和开关类型
11.1.2驱动强度
11.1.3延迟
11.1.4实例数组
11.2 and、nand、nor、or、xor、xnor
11.3 buf、not
11.4 bufif1、bufif0、notif1、notif0
11.5 MOS switches
11.6 Bidirectional pass switches
11.7 pullup、pulldown
第12章 用户定义原语
12.1 UDP定义
12.1.1 UDP状态表
12.1.2状态表符号
12.2组合UDP
12.3电平敏感时序UDP
12.4沿敏感时序UDP
第13章 行为模型
13.1概览
13.2过程赋值
13.2.1阻塞赋值
13.2.2非阻塞赋值
13.3过程连续赋值
13.3.1 assign和deassign过程语句
13.3.2 force和release过程语句
13.4条件语句
13.5循环语句
13.5.1 for循环例子
13.5.2 disable语句
13.6过程时序控制
13.6.1延迟控制(Delay control)
13.6.2事件控制(Event control)
13.6.3命名事件(Named events)
13.6.4事件or操作符(Event or operator)
13.6.5隐含事件列表(Implicit event_expression list)
13.6.6电平敏感事件控制(Level-sensitive event control)
13.6.7赋值间时序控制(Intra-assignment timing controls)
13.7块语句
13.7.1顺序块(Sequential block)
13.7.2并行块(Parallel block)
13.7.3块名字(Block names)
13.7.4开始和结束时间(Start and finish times)
13.8结构化过程
13.8.1 initial construct
13.8.2 always construct
13.8.3 always的敏感列表
13.8.4并发进程
13.9 always有关的问题
13.9.1敏感列表不完整
13.9.2赋值顺序错误
第14章 case语句
14.1 case语句定义
14.2 case语句的执行
14.3 Verilog和VHDL对比
14.4 case的应用
14.5 casez的应用
14.6描述状态机
14.7 casex的误用
14.8 casez的误用
14.9 full case和parallel_case
14.10 full case
14.10.1不是full的case语句
14.10.2是full的case语句
14.10.3使用full case综合指令
14.10.4 full case综合指令的缺点
14.10.5使用full case指令后还是生成Latch
14.11 paralle_ase
14.11.1不是parallel的case语句
14.11.2是parallel的case语句
14.11.3使用parallel case综合指令
14.11.4 parallel case综合指令的缺点
14.11.5没有必要的parallel case指令
14.12综合时的警告
14.13 case语句的编码原则
第15章 task和function
15.1 task和function之间的不同点
15.2 task的声明和使能
15.2.1 task的声明
15.2.2 task的使能和参数传递
15.2.3 task的内存使用和并发进程
15.3 disable语句
15.3.1 disable语句的例子A
15.3.2 disable语句的例子B
15.4 function的声明和调用
15.4.1 function的声明
15.4.2 function的返回值
15.4.3 function的调用
15.4.4 function的规则
15.4.5 constant function
15.5 task的误用
15.6 function的误用
第16章 调度和赋值
16.1仿真过程
16.2事件仿真
16.3仿真参考模型
16.4分层事件队列
16.4.1事件队列分类
16.4.2事件队列特性
16.4.3事件调度例子
16.5确定性和不确定性
16.5.1确定性(Determinism)
16.5.2不确定性(Nondeterminism)
16.6赋值的调度含义
16.6.1连续赋值
16.6.2过程连续赋值
16.6.3阻塞赋值
16.6.4非阻塞赋值
16.6.5开关处理
16.6.6端口连接
16.6.7任务和函数
16.7阻塞赋值和非阻塞赋值
16.7.1阻塞赋值
16.7.2非阻塞赋值
16.8赋值使用原则
16.9自己触发自己
16.10仿真零延迟RTL模型
16.11惯性延迟和传输延迟
16.11.1门级仿真中的传输延迟
16.11.2各种#delay的位置
16.11.3仿真时钟生成方法
16.12延迟线模型
16.13使用#1延迟
16.14多个公共时钟和竞争条件
16.15 避免混杂阻塞赋值和非阻塞赋值
16.16 RTL和门级混合仿真
16.16.1 RTL-to-Gates仿真
16.16.2 Gates-to-RTL仿真
16.16.3有时钟偏差的门级时钟树
16.16.4有时钟偏差的Vendor模型
16.16.5错误的Vendor模型
16.16.6结论和建议
16.17带有SDF延迟的门级仿真
16.17.1全系统仿真
16.17.2软件要花钱
16.17.3门级回归仿真
16.18验证平台技巧
16.18.1在0时刻复位
16.18.2时钟沿之后复位
16.18.3创建仿真时钟
16.18.4在无效沿输入激励
第17章 层次结构
17.1模块
17.1.1模块定义
17.1.2模块实例
17.2参数
17.2.1参数声明
17.2.2参数调整
17.2.3参数传递
17.2.4参数依赖
17.2.5内部参数
17.2.6 clog2
17.2.7指数**
17.3端口
17.3.1端口声明
17.3.2端口连接
17.3.3实数传递
17.4 Generate语句
17.4.1 Loop generate construct
17.4.2 Conditional generate construct
17.5实例数组
17.6层次名字
第18章 系统任务和函数
18.1显示任务
18.1.1显示和写出任务
18.1.2探测任务
18.1.3监控任务
18.2文件读写
18.2.1打开和关闭文件
18.2.2文件输出
18.2.3字符串输出
18.2.4文件输入
18.2.5文件定位
18.2.6刷新输出
18.2.7错误状态
18.2.8检查文件尾部
18.2.9加载文件数据
18.3时间比例
18.3.1 $printtimescale
18.3.2 $timeformat
18.4仿真控制
18.4.1 $finish
18.4.2 $stop
18.5仿真时间
18.6转换函数
18.7概率分布
18.7.1 $random
18.7.2 $dist functions
18.8命令行输入
18.8.1 $test$plusargs
18.8.2 $value$plusargs
18.9数学运算
18.9.1整数函数
18.9.2实数函数
18.10波形记录
第19章 编译指令
19.1 ?celldefine和?endcelldefine
19.2 ?default_nettype
19.3 ?define和?undef
19.4 ?ifdef、?else、?elsif、?endif、?ifndef
19.5 ?include
19.6 ?resetall
19.7 ?line
19.8 ?timescale
19.9 ?unconnected drive和?nounconnected drive
19.10 ?begin_keywords和?end_keywords
19.11 ?pragma
第20章 Specify块
20.1 specify块声明
20.2 speparam
20.3模块路径声明
20.3.1模块路径要求
20.3.2简单路径
20.3.3沿敏感路径
20.3.4状态依赖路径
20.4模块路径延迟
第21章 时序检查
21.1概览
21.2使用稳定窗口的时序检查
21.2.1 $setup、$hold、$setuphold
21.2.2 $recovery、$removal、$recrem
21.3时钟和控制信号的时序检查
21.3.1 $skew、$timeskew、$fullskew
21.3.2 $width
21.3.3 $period
21.3.4 $nocbange
21.4使用notifier响应时序违反
21.5使用条件事件
21.6时序检查中的Vector
21.7 Negative timing check
第22章 反标SDF
22.1 SDF标注器
22.2 SDF construct到Verilog的映射
22.2.1 SDF路径延迟到Verilog的映射
22.2.2 SDF时序检查到Verilog的映射
22.2.3 SDF互连延迟的标注
22.3 $sdf_annotate
22.4 SDF文件例子
第23章 编程语言接口
23.1 DirectC
23.2 SystemVerilog
第24章 综合指令
24.1 Synopsys综合指令
24.2使用综合指令
24.3使用translate_off/on
24.4误用translate_off/on
24.5使用attribute
第三部分 书写文档
第25章 书写文档
25.1文档格式
25.2定义文档
25.3应用文档
25.4设计文档
25.5备份文档
25.6 GPIO设计
第26章 GPIO应用文档
26.1 Overview
26.2 Register Description
26.2.1 PIN Level Register(PIN)
26.2.2 Data Register(DAT)
26.2.3 Data Set Register(DATS)
26.2.4 Data Clear Register(DATC)
26.2.5 Mask Register(IM)
26.2.6 Mask Set Register(IMS)
26.2.7 Mask Clear Register(IMC)
26.2.8 PULL Enable Register(PEN)
26.2.9 PEN Enable Set Register Register(PENS)
26.2.10 PEN Enable Clear Register Register(PENC)
26.2.11 PSEL Select Register(PSEL)
26.2.12 PSEL Enable Set Register Register(PSELS)
26.2.13 PSEL Enable Clear Register Register(PSELC)
26.2.14 Function Register(FUN)
26.2.15 Function Set Register(FUNS)
26.2.16 Function Clear Register(FUNC)
26.2.17 Select Register(SEL)
26.2.18 Select Set Register(SELS)
26.2.19 Select Clear Register(SELC)
26.2.20 Direction Register(DIR)
26.2.21 Direction Set Register(DIRS)
26.2.22 Direction Clear Register(DIRC)
26.2.23 Trigger Register(TRG)
26.2.24 Trigger Set Register(TRGS)
26.2.25 Trigger Clear Register(TRGC)
26.2.26 FLAG Register(FLG)
26.2.27 FLAG Clear Register(FLGC)
26.3 Program Guide
26.3.1 GPIO Function Guide
26.3.2 Alternate Function Guide
26.3.3 Interrupt Function Guide
26.3.4 Disable Interrupt Function Guide
第27章 GPIO设计文档
27.1文件列表(见表27-1)
27.2端口列表(见表27-2)
27.3配置参数(见表27-3)
第四部分 高级设计
第28章 使用IP
28.1 Cadence的IP
28.2 Cadence的VIP
28.3 Synopsys的IP
28.4 DesignWare Building Block
28.5在FPGA上使用DesignWare
第29章 代码优化
29.1代码可读
29.2简洁编码
29.3优化逻辑
29.4优化迟到信号
29.5括号控制结构
第30章 状态机设计
30.1状态机类型
30.2状态编码方式
30.3二进制编码FSM
30.3.1两个always块
30.3.2重要的编码规则
30.3.3错误状态的转换
30.3.4 next的默认值
30.4独热码编码FSM
30.5寄存器输出
第31章 可配置设计
31.1格雷码转换
31.2通用串行CRC
31.2.1 general_crc.v
31.2.2 testbench
31.3 FIFO控制器
31.4 RAM Wrapper例子
31.4.1常规方法
31.4.2名字规范化
31.4.3 RFl_wrapper.v
31.4.4 gen_wrapper.pl
31.4.5 ram_def.txt例子
31.4.6生成wrapper
31.5可配置的GPIO设计
31.5.1 gpio.v
31.5.2 gpio_params.v
31.5.3 gpio_check.v
31.5.4 gpio_reg.v
31.5.5 gpio_sync.v
31.6可配置的BusMatrix
31.6.1 BusMatrix简介
31.6.2设计ABM
31.6.3 mini abm
31.6.4 large-abm
31.7可配置的Andes Core N801
31.8可配置的ARM926EJS
31.9灵活的coreConsultant
第32章 可测性设计
32.1内部扫描
32.2内建自测
32.3边界扫描
第五部分 时钟和复位
第33章 异步时序
33.1亚稳态
33.2 MTBF
33.3同步器
33.3.1电平同步器
33.3.2边沿检测同步器
33.3.3脉冲检测同步器
33.4同步多位数据
33.5异步FIFO
33.6 Design Ware
33.7 DW_fifoctl_s2_sf
33.8门级仿真
第34章 时钟生成
34.1同步电路
34.2设计原则
34.3分频器
34.3.1 1/n分频器
34.3.2 n/d分频器
34.4时钟切换
34.5时钟生成
第35章 时钟例子
35.1 Overview
35.2 CGU Clock
35.2.1 Clock List
35.2.2 Clock Diagram(见图35-1)
35.2.3 Clock Divider Rate(见表35-1)
35.3 Register Description(见表35-2)
35.3.1 CGU PLL Divider Register(CGU_PDR)
35.3.2 CGU Counter Regsister(CGU_CNT)
35.3.3 CGU PLL Control Register(CGU_PCR)
35.3.4 CGU Low Power Control Register(CGU_LPC)
35.3.5 CGU Status Register(CGU_CST)
35.3.6 CGU Divider 0 Register(CGU_DV0→1/s)
35.3.7 CGU Divider 1 Register(CGU_DV1→1/x)
35.3.8 CGU Divider 2 Register(CGU_DV2→1/n)
35.3.9 CGU Divider 3 Register(CGU_DV3→1/n)
35.3.10 CGU Divider 4/5/6/7 Register(CGU_DV4/5/6/7→n/d)
35.3.11 CGU Divider 8 Register(CGU_DV8→n/d)
35.3.12 CGU Divider 9 Register(CGU_DV9→n/d)
35.3.13 CGU Module Stop 0 Register(CGU_MS0)
35.3.14 CGU Module Stop 1 Register(CGU_MS1)
35.3.15 CGU Module Stop 2 Register(CGU_MS2)
35.3.16 CGU Reset Control Register(CGU_RCR)
35.3.17 CGU Reset Status Register(CGU_RST)
35.4 PLL Structure
35.4.1 Frequency Calculation
35.4.2 VCO Frequency Limitation
35.4.3 PFD Clock Frequency Limitation
35.5 PLL Control
35.6 Sleep and Wakeup
35.6.1 State switch
35.6.2 How to wakeup
35.7 Module Stop
35.8 Application Notes
第36章 复位设计
36.1复位的用途
36.2寄存器编码风格
36.2.1有/无同步复位寄存器
36.2.2寄存器推导原则
36.3同步复位
36.3.1编码风格和电路
36.3.2同步复位的优点
36.3.3同步复位的缺点
36.4异步复位
36.4.1编码风格和电路
36.4.2既有异步复位又有异步置位的寄存器
36.4.3异步复位的优点
36.4.4异步复位的缺点
36.5异步复位的问题
36.5.1复位recovery时间
36.5.2复位撤销经历不同的时钟周期
36.6复位同步器
36.6.1复位同步器有亚稳态吗?
36.6.2错误的ASIC Vendor模型
36.6.3有缺点的复位同步器
36.6.4复位时的仿真验证
36.7复位分布树
36.7.1同步复位分布技巧
36.7.2异步复位分布技巧
36.7.3复位分布树的时序分析
36.8复位毛刺的过滤
36.9异步复位的DFT
36.10多时钟复位的问题
36.10.1非协调的复位撤销
36.10.2顺序协调的复位撤销
36.11结论
第六部分 验证之路
第37章 验证之路
37.1整洁验证
37.2验证目标
37.3验证流程
37.4验证计划
37.5随机验证
37.6直接验证
37.7白盒验证
37.8模块验证
37.9系统验证
37.9.1验证重点
37.9.2验证环境
37.9.3 IP互连
37.9.4性能验证
37.10 DFT验证
37.11网表验证
37.12高级抽象
37.13灵活验证
37.14 ARM926EJS的Validation环境
37.14.1 Validation tools
37.14.2 Validation configuration files
37.14.3 Validation test suites
37.14.4 Validation flow
37.14.5 Building the model
37.14.6 Running Validation test suites
37.14.7 Debugging a single Validation test
37.15 AHB BusMatrix的验证
37.16某芯片的SoC验证环境
第七部分 其他介绍
第38章 SystemVerilog特性
38.1 SystemVerilog与Systemc比较
38.2 SystemVerilog的特点
38.3新的数据类型
38.3.1整型和实型
38.3.2新的操作符
38.3.3数组
38.3.4队列
38.3.5枚举类型
38.3.6结构体和共同体
38.4 always comb、always_latch和always_ff
38.5 unique和priority
38.6 loop、break和continue
38.7 task和function
38.7.1静态和自动作用域
38.7.2参数传递
38.7.3参数中的默认值
38.8 Port connection
38.9 Tag
38.10 Interface
38.11 class和object
38.11.1对象的概念
38.11.2类的创建
38.11.3类的继承
38.11.4类的randomize
38.11.5类的cover group
38.12 VMM、OVM和UVM
参考文献
关于版权