概述
一、关于verilog的基础知识
(一)设计:
- 数据类型
- reg:寄存器类型
- wire:线网类型
- 数据表示
- 向量:
reg [7:0] var;
声明一个位宽为8的寄存器向量 - 数组:
wire [7:0] var[0:3];
声明一个数组,这个数组里面有4个8bit的线网向量 reg [7-:8] var;
等价于reg [7:0] var;
- 索引:通常从高位向低位索引,比如
var[3:0]
,但也可以反过来var[0:3]
。 - 其他还有integer、real、parameter较为常见
- 向量:
- 阻塞赋值和非阻塞赋值
- 阻塞赋值:
var[3:0] = 4'b0000;
- 非阻塞赋值:
var[7:4] <= 4'b1010;
- 阻塞赋值有先后顺序、非阻塞赋值没有
- 通常组合逻辑中使用阻塞赋值、时序逻辑中使用非阻塞赋值
- 阻塞赋值:
- always块
always@()begin end
- 括号里面的叫敏感量表,当里面任何一个敏感量发生变化的时候,就会执行一遍块内的表达式
- 敏感量有时钟的,就是时序逻辑;
- 对于组合逻辑,为了避免综合出锁存器,需要将所有右值放进敏感量表或者写成
always@(*)
- 模块例化规则
- 顺序连接:不建议使用
- 命名连接:
module_name inst_name#(parameter_list)(.portname1(port1),.portname2(port2))
- 生成器例化:generate,同时例化多个模块
- 注意⚠️:输入端口只能连接reg类型,输出端口只能连wire类型。
- 有限状态机
- moore机
- mealy机
- 一般用case语句实现
- 避免竞争冒险
- 避免多端驱动
- 组合逻辑块写成
always@(*)
- if-else、case-default写完整
- 流水线设计
- 以空间换时间
(二)测试
-
initial块
initial begin end
- 只出现在testbench里面,内部表达式只执行一次
-
wait(event):等待事件触发,程序会在此中断,其他模块的也不会执行
-
@(event):等待时间触发,块在此停止,但不影响其他模块的表达式执行
-
repeat(n):重复执行n次
-
event:声明一个事件;
->eventName
语句表明事件被触发 -
$stop:停止执行
-
$finish:终止执行
-
$display:相当于c语言中的一次printf
-
$monitor:监控某个信号,发生变化则printf一次
-
$random:产生随机数
-
$time:返回当前仿真时刻
-
信号探针:可以通过instName.signalName访问变量值
二、一些简单的电路
(一)组合逻辑电路
- 复用器
- 半加器
- 全加器
- 行波进位加法器
- 先行进位加法器
- 减法器
- 比较器
- 移位器
- 循环移位器
(二)时序逻辑电路
- 计数器
- 移位寄存器
- 循环移位寄存器
- 分频器
- 同步fifo
- 异步fifo(跨时钟域)
三、关于时序约束和功耗约束
-
DTA和STA
- DTA:动态时序分析,写激励文件仿真,耗时长、达到完备性需要大量测试向量
- STA:静态时序分析,生成有向无环图,耗时短、可能存在错误路径、且只适用于同步电路
-
同步复位和异步复位
- 复位信号必须持续到时钟触发
- 异步复位属于即刻复位
- 一般的做法是异步复位同步释放
-
setupTime和holdTime
- setupTime:建立时间
- $setup(posedge sys_clk, sig_a, 5):系统钟和信号a的建立时间约束在5个单位以内,否则报错
- holdTime:保持时间
- $hold(posedge sys_clk, sig_a, 5):
- $setuphold(posedge sys_clk, sig_b, 5, 3):系统钟和信号b的建立时间约束在5个单位以内,并且建立时间约束在3个单位以内,否则报错
-
skew
- 时钟边缘倾斜
-
时序违背的解决办法:
- 降低时钟频率
- 缩短关键路径
- 升级工艺或编程器件
-
关键路径处理:
- 约束布局布线
- 插入buffer
- 改进并行算法
- 调整元件尺寸
- pipeline
-
数字电路的功耗
- 动态耗散
- 漏电流
- 短路电流
-
低功耗设计
-
DVS:根据历史工作情况动态调整工作电压
-
DVFS:根据当前工作频率,动态调整工作电压
-
门控时钟
-
GALS:全局异步本地同步技术
-
pipeline
-
采用特殊编码方式,减少信号比特翻转(同时还能减少glitch)
-
插入缓冲器,以减少活跃电路电容
-
power gating:切断模块供电
-
Adaptive Body Bias:动态调整晶体管阈值电压,减少漏电流
-
最后
以上就是俊逸大地为你收集整理的【数电】数电基础知识的全部内容,希望文章能够帮你解决【数电】数电基础知识所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复