选择题易错点复习ch1
选择题易错点复习
低成本设计要兼顾低功耗设计,影响成本的主要因素是diesize盒封装
reg [0:127] data;
data[127-:8]; // 表示 data [120:127]
generate语句中循环控制变量必须是genvar
时序逻辑中if选择语句,没有else部分表达不会综合出latch
system verilog的构造函数
- 默认情况下系统会在定义的类中默认创建一个new()函数,也可由我们自己定义。(可以不定义,自动生成)
- 在使用new()函数创建对象过程中,除了会为类中各个对象分配内存之外,还会将变量设置为默认数值
- new函数由于是构造函数,其本身不能有返回值,而是返回一个指向类对象的句柄,其类型就是类本身。new函数返回一个指向类对象的句柄。啥意思呢,其实就是
A obj = new()
这里new返回的就是指向类的句柄
有关于扩展类的构造函数
- 如果父类的构造函数传参具有默认值,或者没有参数传递,那么子类在调用new的时候,无论是否显示调用super.new都会调用父类的构造函数
- 如果父类的构造函数需要传参,且没有默认值,那么必须显示调用super.new
中断寄存器的类型
中断指示寄存器是实时告警的状态触发的,并且是只读寄存器。
中断模式寄存器:用来设置哪几个中断源产生中断
中断屏蔽寄存器(mask):当某一位设置为masked,对应的那个中断源产生的中断会屏蔽掉
中断源寄存器:中断是那个中断源产生的
中断优先级寄存器:表示优先级
verilog readmemb and readmemh
verilog读取文件数据到程序的函数
-
readmemb
:需要数据是二进制数据 可以出现x z 和下划线 -
readmemh
:需要数据是16进制数据 可以出现x z 和下划线 -
出现下划线的情况 比如1_1_ 那么读到的数据会忽略下划线,读出0011
-
函数的参数格式:
-
(1)$readmemb("<数据文件名>",<存储器名>);
(2)$readmemb("<数据文件名>",<存储器名>,<起始地址>);
(3)$readmemb("<数据文件名>",<存储器名>,<起始地址>,<终止地址>);
动态数组的内建方法
new[]; // new[]对于同一个动态数据是可以多次调用的,但是是破坏性的,前面的数据就都没有了,之前的引用也会失效
size();
delete();
队列中的元素是连续存放的,所以在队列的前面或者后面存取数据非常方便。无论队列有多大,这种操作所耗费的时间都是一样的。在队列中间增加或删除元素需要对已经存在的数据进行搬移以便腾出空间,相应操作所耗费的时间会随队列的大小线性增加。
4
判断时序关系,下面选项正确的是:
initial begin
forever #10 clk1 = !clk1;
end
always @(clk1) clk2<=clk1;
initial begin
#5 rst<=0;
#40 rst<=1;
end
always @(posedge clk1 or negedge rst) begin
if (!rst) c <=0;
else c <=c+1;
end
always @(posedge clk1) $display("%0t ns, c = %0d",$time,c);
always @(posedge clk2) $display("%0t ns, c = %0d",$time,c);
System Verilog中的例化是动态的。因为在System Verilog中,激励对象不断地被创建并用来驱动DUT,检查结果。最后这些对象所占用地内存可以被释放,一共新的对象使用。
有关DFT
DFT虽然是后端的,但是老考选择,总结一下
ECO表示工程改动要求,就是代码freeze了之后,工程有问题,后端改,改了之后的网表当然也要考虑对DFT网表的变化。
主流SCAN采用MUX-DFF (DFT的时候会更换寄存器)
SCAN的设计规则,需要保证时钟复位可控
PVT
process voltage temperature
控制信号的安全性
always @(posedge clk)begin
din_dly <= din;
end
对于din是数据信号来说,这样是可以的,因为数据寄存器不需要复位。对于控制信号来说不行,因为没有进行打拍处理,可能讲din不定态传播出去。
verilog不定态的传播
verilog的if else和case语句是不能传播不定态的,如果if(x)会默认为false,对于case,如果有default,不定态会跳到default,如果没有,不会匹配到任何语句
能传播不定态的形式 使用?:
,verilog标准中规定了 当表达式assign a = exp1 ? exp2 : exp3
当exp1的结果是x时,那么计算结果为exp2和exp3的按位计算。计算规则为全0为0,全1为1,其他结果都是x。如此实现了不定态的传播。
冯诺伊曼结构和哈弗结构
- 冯诺伊曼结构:数据和指令在同一个存储空间内(同一个物理空间)
- 哈弗结构:数据和指令分开存储(两个分开的物理空间)
- 因此对于哈弗结构来说:取指令和执行能够完全重叠(取指和执行用到的是两个分开的物理空间)
使用pipeline会导致数据延时增加,但如果工作频率不变,系统的吞吐量会增加
有符号数位宽扩展
- 位宽小到位宽大:补符号位
- 位宽大到位宽小:直接截断
对于短位宽赋值给长位宽的情况,需要对高位进行位扩展,具体是扩展1还是扩展0,记住:完全依据右操作数!,具体如下:
- 右操作数是无符号数,则无论左操作数是什么类型,高位都扩展成0
- 右操作数是有符号数,则要看右操作数的符号位,按照右操作数的符号位扩展,符号位是1就扩展1,是0就扩展0;
- 位扩展后的左操作按照是无符号数还是有符号数解释成对应的十进制数值,如果是无符号数,则直接转换成十进制数值,如果是有符号数,则看成2的补码解释成十进制数;
- 从上面4种情况看出,有符号数赋值成无符号数会出现数据错误的情况,因此要避免这种赋值,而其他情况都是可以保证数据正确的。
独立复位
对于独立复位的模块,考虑对后级模块的影响,也需考虑对前级模块的影响(可能有反馈)。
格雷码/独热码/二进制码优缺点
- 二进制码、格雷码使用最少的触发器,但是消耗较多的组合逻辑(用于译码) ;
- 独热码则正好相反,因为状态比较时仅需要比较一位,从而在一定程度上简化了译码逻辑。虽然在表示同样的状态时,独热码占用较多的位,也就是消耗较多的触发器,但这些额外的触发器占用面积可与译码电路省下来的面积相抵消。
- 独热码由于状态译码简单,可减少组合逻辑且速度较快
在Verilog代码中,对有符号数进行比特选择或拼接,其结果是有符号数
并行设计降低功耗(主要降低工作频率)
- 并行与流水:采用并行处理,可以降低系统工作频率,从而可能降低功耗.
功耗的构成
静态功耗 动态功耗 浪涌 (平均功耗不考虑)
Perl循环
last跳出循环陈述,next到循环的下一个陈述
综合
.综合(Synthesis)简单地说就是将HDL代码转化为门级网表的过程
Mapping把用GTECH库元件构成的电路映射到某一特定厂家的工艺库上
Translation是指把HDL语言描述的电路转化为用GTECH库元件组成的逻辑电路的过程
三个流程:Translation,Mapping,Optimization
Verilog动态位宽截取
vect[base±:width],base表示起始位,width表示截取宽度,base可变,width必须为常量。
截取用小括号,拼接用大括号
task中不能使用always initial等事件控制
Verilog 提供了 2 大类时序控制方法:时延控制和事件控制。但Task中不能出现initial和always块,因此一般事件控制就没办法在task中使用。
verilog去余运算 符号情况
Verilog里的模运算(即取余),先把各自的符号位去掉,然后余数与第一个运算数的符号位一致就是最后的结果了。
verilog运算优先级
- 算数运算符
!~*/% + -
- 移位运算符
>> <<
- 关系运算符
<= >= > <
- 等式运算符
== != !== ===
- 缩减运算符
& | ^ ^~
(但不包括逻辑非) - 条件运算符
?=
- 拼接运算符
{}
建立可综合模型的原则
要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:
(1)不使用初始化语句。
(2)不使用带有延时的描述。
(3)不使用循环次数不确定的循环语句,如forever、while等。
(4)不使用用户自定义原语(UDP元件)。
(5)尽量使用同步方式设计电路。
(6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。
(7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。
(8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。
(9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。
(10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。
(11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。
(12)避免混合使用上升沿和下降沿触发的触发器。
(13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。
(14)避免在case语句的分支项中使用x值或z值。
二位和四位查找表乘法器相差一个周期体现在调用任务上
有关UDP
UDP可以有多个输入端,最多允许有10个输入端
UDP只能有一个输出端,而且必定是端口说明列表的第一项
在UDP的真值表项中,只允许出现0,1,X的三种逻辑值,高阻值状态Z是不允许出现的。
只有输出端才可以被定义为寄存器类型变量。
比较器面积
常见元件面积 加法器> 比较器> 选择器
大于和小于比较器面积是相同的
避免竞争冒险的手段
- 增加滤波电容
- 增加冗余项
- 增加选通信号
verilog内建函数 $write $display
display会自动换行,write不会