数字系统设计复习笔记:第一篇
常用缩写
我猜必考,你觉得呢?
- VHDL: VHSIC Hardware Description Language
- VHSIC: Very High-Speed Integrated Circuit
- HDL: Hardware Description Language
- CAD: Computer-Aided Design
- EDA: Electronic Design Automation
- LSI: Large Scale Integration
- ULSI: Ultra-Large Scale Integration
- ASCII: American Standard Code for Information
- ISO: International Standards Organization
- ASIC: Application-Specific Integrated Circuit
- FPGA: Field-Programmable Gate Array
- PLA: Programmable Logic Array
- PAL: Programmable Array Logic
- PLD: Programmable Logic Device
- CPLD: Complex Programmable Logic Device
- STA: Static Timing Analysis
题外话
去年考数字CMOS,考了个STA,结果没写出来。这下忘不掉了。
现代设计方法
- 选用合适的 EDA仿真工具
- 选用合适电路图输入和HDL编辑工具
- 逐个编写可综合HDL模块
- 逐个编写HDL测试模块
- 逐个做Verilog HDL 电路逻辑访真
- 编写Verilog HDL总测试模块
- 做系统电路逻辑总仿真
- 选用合适的基本逻辑元件库和宏库
- 租用或购买必要的IP核
- 选用合适的综合器
- 进行综合得到门级电路结构
- 布局布线,得到时延文件
- 后仿真
- 定型,FPGA编码或ASIC投片。
HDL设计vs原理图设计 Pros&Cons
原理图Schematic | 代码HDL Coding |
---|---|
自下而上 | 自上而下 |
搭建原理电路较复杂 | 代码编写较简单 |
耗时长 | 较节约时间 |
特殊化定制 | 规范化设计 |
较难理解分析 | 易于理解分析 |
Verilog HDL设计的最大优点就是其工艺无关性。
这使得工程师在功能设计及逻辑验证阶段可以不必过多考虑门级及工艺实现的具体细节,只需根据系统设计的要求施加不同的约束条件,即可设计出实际电路。
抽象等级
什么是Verilog电路设计的抽象级别?可以理解成地壳的结构,由外而内。
层次从高到低:
-
系统级(System Level): 使用高级语言结构来实现设计模块的外部性能模型。
-
算法级(Algorithm Level): 用高级语言结构来实现设计的算法部分。
-
寄存器传输级(RTL): 用Verilog HDL/VHDL/SystemVerilog/SystemC语言描述,是实现具体逻辑电路的常用级别。
以上三种都属于行为描述,只有RTL级才与逻辑电路有明确的对应关系。
-
门级(Gate Level): 描述电路的逻辑门和连接,更接近硬件实现。
与逻辑电路有确定的连接关系,以上4种数字系统设计工程师必须掌握。
-
开关级(Switch Level)
门级其实就是晶体管级,因为晶体管表现为开关
Verilog语法最重要的三个概念:
- 并行性
- 层次结构性
- 可综合性
综合是什么?
综合(Synthesis),就是将HDL代码转为电路并进行优化。
对于EDA工具来说,这只是一个映射的过程,系统设计人员就不必过于关心其逻辑构成的细节,而把主要精力集中在系统结构的考虑上,从而大大提 高了设计效率。
“什么叫综合?综合是由什么工具来完成的?通过综合产生的是什么? 产生的结果有什么用处?”
答案
通过综合工具把行为级描述的模块通过逻辑网表自动转化为门级形式的模块叫综合。由EDA工具来完成综合。通过综合产生的是由与门,或门和非门组成的加法器,比较器等组合逻辑。产生的模块很容易与某种工艺的基本元件逐一对应起来,再通过布局布线工具自动地转变为某种工具工艺的电路布线结构。
测试平台是什么?
测试平台(Testbench),是用来描述测试信号的变化和测试过程的模块。
它可以对上面介绍的电路模块(无论是行为的或结构的)进行动态的全面测试。
仿真是什么?
“仿真是什么? 为什么要进行仿真?仿真可以在几个层面上进行? 每个层面的仿真有什么意义?”
答案
仿真是对电路模块进行动态的全面测试。通过观测被测试模块的输出信号是否符合要求可以调试和验证逻辑系统的设计和结构准确与否,并发现问题及时修改。仿真分为:前仿真,逻辑网表仿真,门级仿真和布线后仿真。前仿真,逻辑网表仿真,门级仿真,可以调试和验证逻辑系统的设计和结构准确与否,并发现问题及时修改。布线后仿真:可分析设计的电路模块的运行是否正常。
我猜会考,但老师说:“为什么要用这种形式考概念?又不是思政课。”
Verilog的基本设计单元
基本设计单元就是模块(Module)。模块与模块之间通过端口进行通讯,在模块中实例化另一个模块,可以构成一个复杂的层次化系统。
一个模块是由两部分组成的,一部分描述接口, 另一部分描述逻辑功能。
一个模块表示一个设计,其描述方式包括:
- 数据流方式——连续赋值语句
assign
- 行为方式——过程语句
always/fork
- 结构方式——其他模块和门级原语
- 混合方式——行为+结构+数据流等
模块的基本构成要素:端口信息,输入/输出说明,逻辑功能描述。
所有过程块(如:initial块、always块)、连续赋值语句、实例引用都是并行的
延时标记?
“ # 用于说明过程(Procedural)语句和门的实例的延时,但不能用于模块的实例化。”
这句话的意思是:内置的门级原语生成可以用#来表示延迟,但是模块实例化则不能这样使用。
为什么?
因模块中使用# 用于设定内置参数。 例:
1 | my_module #(parameter_value) instance_name (port_map); |
变量类型
1 | 7’Hx // 7位宽十六进制数,扩展到xxxxxxx |
如何分辨有符号数和无符号数?
分析
实际上,Verilog中若无特别声明signed
则都是无符号数,如下:
1 | wire [7:0] unsigned1; |
z与x
- z作为输入时代表x
- 仿真开始时刻,所有的端口都是x
- 如果你忘记连接输入端,这个输入端可以看做是z
parameter
在Verilog HDL中用parameter
定义常量,即用parameter
来定义一个标识符代表一个常量,称为符号常量,即标识符形式的常量。
- 参数用于定义延时和变量宽度。
- 用参数声明语句,参数只被赋值一次,且一直保持不变。
wire
- 只能用连续信号赋值语句赋值,或者通过模块实例的输出端口赋值
- 初始化值为z
reg
- reg类型在赋新值以前保持原值
- 用行为描述结构给reg类型赋值。给reg类型赋值是在过程块中
- reg初始值为x
- 只能在always和initial语句中赋值
运算
算术运算
正常的加减乘没啥好说的。
除法是略去小数部分,取整;取模的结果采用模运算式里第一个操作数的符号位。
若操作数中含有x或者z(部分位或者全部位),则结果为x(全部位)。
例:
1 | 10 % 3 = 1 余数为1 |
还有位运算符。
^~
是同或(异或取反)。注意看PPT P54的表格。
PPT P53的是错的。 更正为:4’b0110 ^ 4’b1000 = 5'b10110
.
如果两个操作数位宽不一样,要按宽位的算。结果位宽需要看被赋值的变量位宽。
逻辑运算
&& || !
这仨。前俩是双目运算符,最后一个是单目。
实际上,只要运算数不为0,它就看做是1废话。
如果任意操作数内包含某一位为x或者z,而且逻辑操作的结果是不定的,则运算的结果为x。
等式运算
1 | == //等于 |
位拼接和部分选择
这俩用的也不少,括号补全要看好。
1 | {repetition_number {expr1, expr2, ..., exprN}} |
规约(缩减)运算符
& ~& | ~| ^ ~^ ^~
1 | a=4‘b0110; |