1.wire
默认模块中的输入都是wire型,输出为reg
wire[3:0] 代表变量由4位构成,在实际电路模型中,代表有4路输入线
2.testbench
开始有点理解实例化的意思,在仿真文件中会涉及到具体的操作,比如赋值给输出等;
在testbench中,我们通过给时钟初始化等步骤,设定好一个仿真文件中程序所要运行的环境,然后通过实例化,把仿真文件中的参数引进来,进行电路测试。
ps. vscode生成波形vcd语句
$dumpfile("reg0.vcd");
$dumpvars;
3.reg/wire
【工程源码】【Modelsim常见问题】TestBench中端口reg和wire定义解惑_小梅哥爱漂流的博客-CSDN博客
在仿真文件中,因为verilog是基于模块设计,所以输入变量一般为wire(导线),输出一般为reg;
Testbench中,正相反,先简单的理解为输入为Reg,输出为wire。更重要的是,testbench
作为顶层模块,其没有输入输出端口,所以直接定义变量类型,无需input/output(ps.若强行定义输入为reg,在initial/always块中会报错)
若出现终端报错
Unknown module type: 实例化模块名,需要先声明宏 `include "XXX.v"
5.如果vcd中无波形,考虑未加截止时间;
6.宏定义
引用.v文件时需要 `include "XXXX.v";ps.语句后不加;
还可以用宏定义参数(区别 parameter PERIOD = 10;)
7.testbench 为top模块,包括要赋给下面模块的值(即实例化),以及参数是如何运转的
与子模块仿真文件不同,仿真文件中无数据,e.g.对于移存器,仿真文件中不会指出需要转移的数据具体是多少,但是testbench中必须指明
8.加法器
4位加法器:
半加器原理:
对于1位二进制加法,真值表
表明,A+B的结果正在门电路上等效为 异或;
对于进位情况,可得知,只有在11情况下才有进位1,此时在门电路上等效为与门,因此在不考虑前一位二进制加法(半加)的情况下,等效电路模型为
全加器:
我们所要输入的不是单独的1位二进制数字,对于连续的二进制串,我们就比要考虑前一位的进位对于本位的影响,因此必须要增加一个输入端口Cin,代表前一位的进位;
最终所得到的
本位输出仍为异或,=a^b^Cin,本位进位输出仍为或门,=(a+b)+(Cin·(a^b))//^异或
门电路如下图
若考虑多位加法器,则(串行)全加器门电路为
由于经过太多门电路会导致主要由门电路延迟(还有线延迟)所带来的延迟以及效率低下(后级门电路需等待前面的门电路输出)问题;
超前进位加法器(并行):
基本思路:每一级门电路只靠 进位输入/出相连,通过分别计算每一级进位输出都和什么信号有关系,可以使得每一级 的进位输出得到并联运行
对于进位输出(这里 · 代表异或)
超前进位加法器: