FPGA记录
- 浮点数11.916的定点无损量化
- 无损量化:量化误差小于量化精度的一半
- 整数部分与小数部分分别量化
- 整数部分11,最少使用4位量化,4-bit表示范围0~15
- 小数部分0.916,假设11.916整体使用11位量化,整数已使用4bit则小数部分还能使用7bit量化,能够表示2的7次方攻击128个刻度,每个刻度的间隔就是 这个值也就是量化精度。
- 小数0.916需要多少个刻度来表示呢?四舍五入取整,则使用117个刻度来表示,误差是0.248个刻度,量化误差大小是0.248*(1/128)=0.0019375。量化误差小于量化精度的一半,认为是"无损量化"。由于量化后误差0.0019375小于精度0.0078125的一半,所以这个误差小到可以认为是无损量化。
- 异步设计的危害:
- 异步设计不能做静态时序分析(STA)
- 静态时序分析(STA)是通过工具对同步电路中所有存在的时序路径进行分析,检查是否存在时序违例。是标准的timing sign-off(时序签字)的工具。
- 异步设计会产生毛刺
- 信号的时延随着每次布局布线的不同而不同,随着PVT( process(工艺) Voltage(电压) Temperature(温度) )的改变而改变,因此可靠性很差,而且不容易移植
- 同步翻转噪声::->指的是大量触发器在同一时刻进行电平切换,会在相邻管脚引入噪声,因此,同步设计才会带来同步翻转噪声。
- 异步设计不能做静态时序分析(STA)
- 可综合的关键字
- 所有综合工具都支持的结构
- always assign begin end case wire tri aupply0 supply1 reg integer default for function and nand or; nor xor xnor buf not bufif0 bufif1 notif0 notif1 if inout input instantitation module negedge posedge operators output parameter
- 所有综合工具都不支持的结构
- time defparam $finish fork join initial delays UDP wait
- 有些工具支持有些工具不支持的结构
- casex casez wand triand wor trior real disable forever arrays memories repeat task while
- 所有综合工具都支持的结构
- 主存和Cache 包含哪几种映射方式
- 全相联映射
- Cache 和主存之间是多对多的关系
- 地址格式 s 代表块地址,w 代表字地址(也叫块内地址)r 代表行地址,d 代表组地址,s - r 和 s - d 代表了区地址
- 直接相联映射
- 主存中每个区的第 i 块会映射到Cache中的第 i 行,Cache 与主存之间是一对多的关系
地址格式
- 组相联映射
- 每个区中的第 i 块对应Cache中的第 i 组( 在直接映射中是每个区中的第 i 块对应Cache中的第 i 行,这点注意 ),在组相联映射中,我们可以将主存中每个区的一块随意存放在 Cache 中某一组的任意一行中。
地址格式
- 全相联映射
- 建立时间(set up time)和保持时间(hold up time)
- 建立时间:触发器数据端提前时钟上升沿到达的最小时间
- 数据到达捕获触发器UFF1 D引脚所花费的总时间必须小于时钟传输到捕获触发器所花费的时间加上时钟周期再减去建立时间要求
- 保持时间:触发器数据端在时钟上升沿到达后的保持时间
- 由时钟边沿发起的数据到达捕获触发器D引脚所需的总时间必须大于时钟同一边沿到达捕获触发器所需的时间加上保持时间
- 建立时间与时钟有关,保持时间与时钟无关但与时钟延时有关
- hold时间违例一般都与时钟线绕线路径太长,时钟晚到有关
- hold时间不满足可适当牺牲set时间
- setup违例可降频,但不推荐
- 数据延时-时钟延时与周期的和 <0 = -setup time
- 数据延时-时钟延时 >0 = hold time
- 建立时间:触发器数据端提前时钟上升沿到达的最小时间
- 三目运算符Y=C?A:B,如果C=x或z,A=1010,B=1100时,Y为1xx0
- cond_expr?expr1:expr2;
- cond_expr为真(即为1),选择expr1
- cond_expr为假(即为0),选择expr2
- cond_expr为x或z,不确定态,结果按以下逻辑expr1和expr2按位操作的值;0与0得0,1与1得1,其余情况为x
- 本题计算过程如下
- 1010
- 1100
-
- 1xx0
- Quartus II是Altera公司的集成开发工具(IDE集成开发环境)。
- LR(logic regression)逻辑回归算法
- 最小化后验概率
- 专用SOC可以分为定制的嵌入式处理芯片和现场可编程嵌入式处理芯片两类
- FPGA芯片可以反复地编程擦除,使用,在较短时间内就可以完成电路的输入、编译、优化、仿真、直至芯片的制作
- SOC芯片中可以有一个或多个CPU
- SOC芯片可以分为通用SOC芯片和专用SOC芯片两大类。
- AMBA总线分有:AHB,ASB,APB,AXI
- SPI串行设备接口(Serial Perripheral Interface) ,不属于AMBA总线,是Motorola公司推出的一种同步串行接口计数,是一种高速的,全双工的,同步的通信总线。SPI主要应用在EEPROM,Flash,实时时钟(RTC)等场景。他在芯片中只占用四根管脚用来控制以及数据传输,节约了芯片的pin数目,同时为PCB在布局上节省了空间
- PCIe(peripheral component interconnect express)是继ISA和PCI总线之后的第三代I/O总线。一般翻译为周边设备高速连接标准。PCIe协议是一种端对端的互联协议,提供了高速传输带宽的解决方案。
- I2C总线是由philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
- 静态时序分析分为以下四种
- 模块外部输入->第一级寄存器数据输入
- 寄存器的时钟引脚->寄存器数据输入
- 寄存器的时钟引脚->模块外部输出
- 模块外部输入->模块外部输出
- 大多数的矢量类型(reg或者net)都被默认当做无符号数。integer和real是个例外,它们被默认为当做有符号数。通常,real类型是不可综合的。
- CMOS静态功耗:电路输出没有状态转换时的功耗。静态时,CMOS电路的电流非常小,使得静态功耗非常小,使得静态功耗非常低。CMOS反相器在静态时,P,N管只有一个导通。由于没有Vdd到GND的直流通路,所以CMOS的静态功耗应该等于零,但实际上,由于扩散区和衬底的PN结上存在反向漏电流,所以会产生静态功耗。
- CMOS动态功耗:电路在输出发生状态转换时的功耗称为动态功耗。它主要由两部分组成。一部分是电路输出状态转换瞬间MOS管的导通功耗。当输出电压由高到低或由低到高变化过程中,在短时间内,NMOS管和PMOS管均导通,从而导致有较大的电流从电源经导通的NMOS管和PMOS管流入地。
动态功耗的另一部分是因为CMOS管的负载通常是电容性的,当输出由高电平到低电平,或者由低电平到高电平转换时,会对电容进行充、放电,这一过程将增加电路的损耗。 - 有符号数的reg以补码形式出现
- “!”表示逻辑取反,“
”表示按位取反 当面对位宽为1时:两个操作符的作用相同。 当位宽不为1时: “”会将变量的各个位依次取反如:a[3:0] ={1,0,0,1} , ~a ={0,1,1,0}; “!”会将变量作为一个值去做处理,非0为1:a[3:0] ={1,0,0,1} ,a=5,!a=0。a[3:0] ={0,0,0,0} ,a=0,!a=1 - 优先级划分:高->低
- 算数运算符 !~*/+-
- 移位运算符 <<>>
- 关系运算符 <=,<,>,>=
- 等式运算符 == (!= ) === (!===)
-
优先顺序 级别 ~! 最高优先级 */% v << >> v < <= > >= v == !== === !=== v & v ^ ^~ v | && || ?: 最低优先级
- $random的一般用法为:
- 1、$random %b,其中b>0。它给出了一个范围在(-b+1):(b-1)中的随机数。
- 2、{$random} %b,其中b>0。它给出了一个范围在0:(b-1)中的随机数。
- ==与===的区别
- 区别在于z,x状态的判别
- ===必须严格相等
- 真值表
=== 0 1 x z 0 1 0 0 0 1 0 1 0 0 x 0 0 1 0 z 0 0 0 1 -
== 0 1 x z 0 1 0 x x 1 0 1 x x x x x x x z x x x x
- 乘法器的实现:
+
- 并行乘法器:并行乘法器是在verilog直接用*表示,这种乘法器要用综合工具得到乘法结果,并行乘法器耗用资源多
- 移位相加乘法器 :移位相加乘法器是从被乘数的最低位开始判断,若为1,则乘数左移i(i=0,1(width-1))位后,与上一次和进行相加,若为0,则乘数左移i位后,以0相加。直到被乘数的最高位:移位相加法实现乘法的优点是占用的资源较少;缺点是速度比较慢,一个结果的输出需要花费多个时钟周期,在高位宽乘法运算中极为明显
- 查找表乘法器
- 加法树乘法器
- 10进制转2进制
- 首先根据转换误差确定二进制小数的位数,然后采用基数乘除法转换。
整数部分采用基数除法,反复初2,则13/2=6,余1 6/2=3,余0 3/2=1,余1,所以(12)D =(1101)B
小数部分采用基数除法,先确定小数的位数。2-m ≤1%,可求出m≥2/lg2=6.64,m取7,则0.6132=1.226 取整数1,0.2262=0.452 取整数0,0.4522=0.904 取整数0,0.9042=1.808 取整数1,0.8082=1.616 取整数1, 0.6162=1.232 取整数1,0.2322=0.464 取整数0, 0.4642=0.928 取整数0最后的小数大于0.5,根据四舍五入,最后应该取1,因为取七位,所以从第八位开始取,10011101,0.0011B =12-1 +12-4+12-5 +12-6+1*2-8 = 0.61328125 误差0.61328125-0.613=0.00028125≈0.03%满足要求。
- 首先根据转换误差确定二进制小数的位数,然后采用基数乘除法转换。
整数部分采用基数除法,反复初2,则13/2=6,余1 6/2=3,余0 3/2=1,余1,所以(12)D =(1101)B
- 静态时序分析:
- 不需要输入向量,就可以计算分析时序是否满足建立时间与保持时间
- 提取出整个电路存在的所有时序路径,计算信号在这些路径上的传播延时,检查信号的建立和保持时间是否满足时序要求
- 不能进行功能验证,因为没有输入向量
- 动态时序分析:就是仿真,可以测试出功能是否符合,需要输入向量。但自己可能写不出完备的测试向量,在进行功能验证的同时及进行时序验证。
- 同步FIFO:
- ram(存储读出数据)
- write_c(产生写入地址,写满信号,写地址转换为格雷码待同步信号)
- read_c(产生读出地址,读空信号,读地址转换为格雷码待同步信号)
- 读空和写满有两种方式:
- 计数cnt读-1,写+1,(cnt=0,读空,cnt=DEPTH,写满)
- 地址多一位方式
- 读空:写地址与读地址相等
- 写满:写地址的最高位与读地址的最高位相反,其余位相同
- 异步FIFO:
- ram(存储读出数据)
- write_c(产生写入地址,写满信号,写地址转换为格雷码待同步信号)
- read_c(产生读出地址,读空信号,读地址转换为格雷码待同步信号)
- sync(将读写地址的格雷码进行两次打拍进行同步)(两个实例,一个写时钟域,一个读时钟域)
- 格雷码地址要多于实际存储地址1bit
- 读空:格雷码写地址与读地址相等
- 写满:格雷码写地址的最高两位与读地址的最高两位相反,其余位相同
- 格雷码来进行判断,降低亚稳态的发生,每次地址变化只有一位发生变化
- 假满:实际没满,因为在读地址同步过来写时钟域的过程中,又读了,但是之前的读地址与写地址满足写满条件,造成假满
- 假空:实际没空,但是写地址同步到读时钟域的过程中,又写了,但此时的地址已经满足读空条件,造成假空
- case,casez,casex的区别
- case,语句中,必须完全相等
- casez,用来处理不考虑高阻值的比较过程
- casex,用来处理不考虑高阻值z和不定态x的比较过程
- 三者均可综合
- 真值表如下
-
case 0 1 x z casez 0 1 x z casex 0 1 x z 0 1 0 0 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 x 0 0 1 0 x 0 0 1 1 x 1 1 1 1 z 0 0 0 1 z 1 1 1 1 z 1 1 1 1
- 在Verilog的算数运算中,11%-3的结果为(2),-10%3的结果为(-1)
- 在进行取模运算时,结果值的符号采用模运算式里第一个操作数的符号位
- reg无符号数就是正常算,结果为负数,就是补码表示,正数就是按正常无符号的计算
- reg有符号数就是按补码算,结果为补码
- function与task的区别:
-
函数 任务 不能有时间控制语句/延迟,因此在同一仿真时间单位内执行 可包含时间控制声明/延迟,且只能在其他时间完成 无法启用任务 可以实现其他任务和功能 至少有一个输入,函数不能有output或者inout 可以有零个或多个任何类型的参数 只能返回一个值 不能返回一个值,但可以使用输出参数达到同样的效果 不含有非阻塞赋值语句 任务定义结构内不允许出现过程块(initial或always过程块)。 函数调用可以出现在过程块或连续赋值语句中 任务调用只出现在过程块中 函数不能单独作为一条语句出现,他只能以语句的一部分的形式出现 任务的调用则是通过一条单独的任务调用语句实现 函数的执行不允许disable语句进行中断 任务的执行可以由disable语句进行中断 可综合出组合逻辑 可综合出组合逻辑
-
- function:
- 语法
-
function [automatic] [return_type] name ([port_list]); [statements] endfunction - 函数声明
-
function [7:0] sum; input [7:0] a, b; begin sum = a + b; end endfunction function [7:0] sum (input [7:0] a, b); begin sum = a + b; end endfunction - 函数调用
-
reg [7:0] result; reg [7:0] a, b; initial begin a = 4; b = 5; #10 result = sum (a, b); end - 函数规则
- 函数不能包含任何时间控制的语句,如#,@,wait,posedge,negedge
- 函数不能调用任务,因为它可能会消耗仿真时间,但可以调用其他函数
- 函数应该至少有一个输入
- 函数不能有非阻塞性的赋值或force...release或assign...deassign
- 函数不能有任何触发器
- 函数不能有output或者inout
- task:
- 函数的作用是对输入进行一些处理,并返回一个单一的值,而任务则更为通用,它可以计算出多个结果值,并使用output和inout类型的参数返回。任务可以包含@、posedge等仿真耗时元素。任务有两种写法,我们接下来会看到。
- 语法
-
// Style 1 task [name]; input [port_list]; inout [port_list]; output [port_list]; begin [statements] end endtask // Style 2 task [name] (input [port_list], inout [port_list], output [port_list]); begin [statements] end endtask - 关键字automatic将使任务重入,否则它将默认为静态的。如果一个任务是静态的,那么它的所有成员变量将在同一任务的不同调用中被共享,该任务已被启动为并发运行。注意,auomatic任务项不能通过层次引用来访问。
- 任务调用
-
task sum (input [7:0] a, b, output [7:0] c); begin c = a + b; end endtask // or task sum; input [7:0] a, b; output [7:0] c; begin c = a + b; end endtask initial begin reg [7:0] x, y , z; sum (x, y, z); end - 全局任务:在所有模块之外声明的任务称为全局任务,因为它们具有全局范围,可以在任何模块中调用。
- 截取操纵
- a[4-:3]=>a[4:2]
- a[base+-:width],base表示起始位,width表示截取宽度,base可变,width必须为常量
- 截取使用[],拼接使用{}
- +表示升序截取 -表示降序截取
- 算数右移:若符号位为1,使用>>>,高位补1; 若符号位为0,使用>>>,高位补0; 对于无符号数来说,无论最高位是什么,使用>>>,高位都补0。
- 在$display中 %0表示采取最小位宽
- 用户定义的原语是从英语User Defined Primitives直接翻译过来的,简称UDP。利用UDP用户可以定义自己设计的基本逻辑元件的功能。
- UDP不可综合,只能仿真
- 其与模块属于同级设计,所以它不能出现在模块内
- 由关键词prmitive和endprimitive封装
- 其功能是通过表table来实现的,即table,endtable。且table只能用于UDP中
- UDP只有一个输出端,而且必定在在端口说明列表的第一项
- UDP可以有多个输入端,最多允许有10个输入端
- UDP所有位宽必须为1位的
- 在UDP的真值表中,只允许出现0、1、X不能出现高阻态Z
- 只有输出端口才能被定义为reg型
- verilog中有符号与无符号(加法乘法)
- a无符号*b无符号=c无符号 (无符号)
- a无符号*b无符号=c有符号(就按无符号的结果,正就是正,负就是补码)
- a无符号*b有符号=c无符号(都按无符号算)
- a有符号*b有符号=c有符号(都按补码存的)有符号变量存的都是补码

- launch edge 最慢时钟算,latch edge 按最快时钟算-->差值悲观时钟-->clock pessimism->加在tskew=tclk2-tclk1;
- clock uncertainty时钟不确定时间->时钟需求时间
- treq=tclk+tclk2+clock pessimism+clock uncertainty-Tsu-(tclk1+tco+tdata=tarrave(时间到达时间));