前言
突然意识到,现在流行的数字IC验证,就是在芯片达到极其复杂的程度,一个testbench已经满足不了需求,才开始有了sv和uvm分层思想的流行。为了做好验证工作,必须了解设计的一切,基本代码还是小意思,最重要的是各种协议。加油吧,少年。
笔记1 :初识FPGA
FPGA(Field Programmable Gate Array):可反复编程的逻辑器件
ASIC(Application Specification Integrated Circuit):专用集成电路
ASSP(Application Specific Standard Parts):专用标准产品
- FPGA、ARM、DSP
FPGA供应商:Altera、Xilinx、Lattice、京微雅格
ARM的DSP
Xilinx的Zynq
Altera的Soc FPGA
- FPGA的基本结构
查找表(Look-up table,LUT):用于执行最基本的逻辑操作
触发器(Flip-Flop,FF):用于存储LUT操作结果的寄存器单元
线(wire):用于连接各个不同的模块单元
输入输出端口(Input/Output pads):FPGA器件与外部芯片互联的引脚
笔记2 :应用领域
- 逻辑黏合与实时控制
- 信号采集处理与协议实现
- 原型验证系统、片上系统与其他应用
笔记3:开发流程
实际的项目中,往往需要一个可靠的团队。将一个工程划分为不同的模块,进行设计、测试等。
设计输入:行为仿真
综合优化:功能仿真
实现 :时序仿真(PrimeTIme)
下载配置:板级调试
笔记4:语法学习的经验之谈
设计输入,除了编写代码,还有绘制原理图和调用IP核。
-
可综合语法 :代码设计
-
不可综合语法:仿真验证
-
做法:参考简单的例程,动手编写代码实现相同或相近的电路功能。
-
常见外设:蜂鸣器、流水灯、数码管、UART、I2C等
代码风格参考:Altera(qs_qii5v1.pdf)或Xilinx(xst.pdf)文档中,有常见电路
笔记5:可综合的语法子集
1.模块声明类语法:module…endmodule
2.端口声明:input,output,inout
3.参数定义:parameter
4.信号类型:wire,reg等
5.比较判断:if…else,case…default…endcase
6.循环语句:for
7.任务定义:task…endtask
8.连续赋值:assign,问号表达式(?)
9.always模块
10.运算操作符
操作符 | 含义 |
---|---|
~& | 与非 |
>> | 逻辑右移 |
<< | 逻辑左移 |
| centered 文本居中 | right-aligned 文本居右 |
11.赋值符号:= 和<=
笔记6:寄存器的核心代码
1.寄存器电路的设计方式
现代逻辑设计中,时序逻辑是核心,而寄存器又是时序逻辑的基础,因此熟记时序逻辑的几种常见代码书写方式是很有必要的。
- 图2.2 基本寄存器
module(clk,din,dout);
input clk;
input din;
output dout;
reg dout;
always @(posedge clk)begin
dout <= din;
end
endmodule
- 图2.3 异步复位的寄存器
module(clk,rst_n,din,dout);
input clk;
input rst_n;
input din;
output dout;
reg dout;
always @(posedge clk or negedge rst_n)begin
if(!rst_n) dout <= 1'b0;
else dout <= din;
end
endmodule
异步复位:在每个时钟信号clk的有效沿(通常是上升沿),输入端信号din被锁存到输出端dout中;而异步复位信号clr的下降沿(低电平有效复位)将强制给输出数据dout赋值0(不论此时的输入数据din取值),此输出状态将一直保持到clr拉高后的下一个clk有效时钟沿触发。
- 图2.4 异步置位的寄存器
module(clk,set,din,dout);
input clk;
input set;
input din;
output dout;
reg dout;
always @(posedge clk or negedge rst_n)begin
if(set) dout <= 1'b1;
else dout <= din;
end
endmodule
异步置位:在每个时钟信号clk的有效沿(通常是上升沿),输入端信号din被锁存到输出端dout中;而异步置位信号set的上升沿(高电平有效复位)将强制给输出数据dout赋值1(不论此时的输入数据din取值),此输出状态将一直保持到set拉底后的下一个clk有效时钟沿触发。
- 图2.4 异步复位和置位的寄存器
- 可能会出现竞争,但是设置优先级即可。(下面代码中,异步复位的优先级高)
module(clk,set,rst_n,din,dout);
input clk;
input set;
input rst_n;
input din;
output dout;
reg dout;
always @(posedge clk or negedge rst_n or posedge set)begin
if(!rst_n)dout <= 1'b0;
else if(set) dout <= 1'b1;
else dout <= din;
end
endmodule
该代码综合出来的寄存器如图2.6
图2.7 带同步使能的寄存器
module(clk,ena,din,dout);
input clk;
input ena;
input din;
output dout;
reg dout;
always @(posedge clk)begin
if(ena) dout <= din;
end
endmodule
同步使能:在每个时钟clk的有效沿(通常是上升沿),判断使能信号ena是否有效(通常取高电平有效),在ena信号有效的情况下din的值才会输出到dout信号上。
2. 同步以及时钟的设计原则
- 建立时间:在时钟的有效沿之前,必须确保输入寄存器的数据建立时间内是稳定的。
- 保持时间:在时钟的有效沿之后,必须确保寄存器的输出数据至少在保持时间内是稳定的。
这些事你要殷勤实行,并要投身其中,使众人看出你的长进来。
笔记7:漫谈状态机设计
-
状态机根据其状态变化是否与输入条件相关分为两类。
Moore型状态机:其状态变化仅和当前状态有关,而与输入条件无关;
Mealy型状态机:其状态变化不仅和当前状态有关,而且与输入条件有关。 -
还可以分类:有限状态机(FSM)和无限状态机(ISM)
笔记8:时序分析
- 一个信号经电路从输入到输出,会产生多大的延时?
- 一组信号经电路从输入到输出,延时一致吗?
建立时间和保持时间
建立时间是指在时钟上升沿到来之前必须保持稳定的时间,保持时间是指在时钟上升沿到来以后数据必须保持稳定的时间。
基本时序路径
内部寄存器之间的时序路径,reg2reg
输入引脚到内部寄存器之间的时序路径,pin2reg
内部寄存器到输出引脚之间的时序路径,reg2pin
输入引脚到输出引脚之间的时序路径(不经过寄存器),pin2pin