1.正确答案是power gating
浪涌、静态功耗、动态功耗是三个最主要的功耗源:
- 浪涌电流是器件上电时产生的最大瞬时输入电流。浪涌电流也称为启动电流
- 静态电流也称待机电流。静态电流包含晶体管的漏电流(PMOS衬底和PMOS漏端构成一个反向偏置PN结,NMOS的漏端和NMOS衬底构成一个反向偏置PN结)和亚阈值导通电流。
-
动态电流包含开关电流和短路电流。开关电流是晶体管对负载电容充放电时产生的电流,短路电流是PMOS和NMOS在转换过程中同时导通的时刻产生的短路电流
一次充电VDD消耗的能量:
一次充电电容存储的能量:
开关的的功耗表达式如下:
- A选项是门控时钟方法。可以关闭特定模块的时钟,完全消除该模块的动态功耗。但是不消除静态功耗
- B选项是关掉内存
- C选项是门控电源方法,将不用的模块的电源直接关闭。免除动态功耗和亚阈值功耗。但是无法完全消除
- D选项HVT是指高阈值器件,同理还有LVT低阈值器件,SVT中等阈值器件。其中高阈值器件阈值电压高,所以亚阈值电流小。所以导致的静态功耗小。但是他的速度慢。LVT器件阈值电压低,所以静态功耗大,但是它的速度快。所以可以对HVT SVT LVT的比例进行调整来满足不同的目的
2.
task:
http://www.asic-world.com/verilog/task_func1.html
-
在模块内部被定义,可以接受输入,也有输出定义形式如下:
-
调用模式如下:
- task本身不会返回任何值,而是执行一段代码。它只会通过调用来执行。如果定义了一个task,但是整个过程都没有调用它。那么这个任务不会被执行。
- task语句的第一行不能列出端口名称
- task的输入输出数量不受限制,甚至可以没有输入,输出以及双向端口
- task中可以出现不可综合的语句。但是会造成任务不可综合
- 在task中可以调用其他任务或者函数,也可以调用自身
- task中不可以出现Initial和always块语句
- task可以在initial和always块中被调用
- task调用语句是过程性语句,所以任务调用中接收返回数据的变量必须是寄存器类型。
- task可以直接使用task外模块内的信号。不用全部都定义在端口
- task中可以出现时间控制语句,比如@(posedge clk)或者是#10这种
function
通过function和endfunction定义
- 函数体内不能有任何形式的时间控制语句
- 函数可以调用函数但是不能调用任务
- 函数至少要有一个输入端口,不允许有输出端口
- 函数的内部变量定义为reg型
-
对函数的调用通过函数名完成,函数调用的返回值也是通过函数名变量传递给调用语句
-
automatic functions
automatic function是verilog-2001的新特性,如果一个函数被同时同时调用时。函数内部声明的变量不必被共享。所以为函数递归调用创造了条件,如下
module function_auto ();
function automatic [7:0] factorial;
input [7:0] i_Num;
begin
if (i_Num == 1)
factorial = 1;
else
factorial = i_Num * factorial(i_Num-1);
end
endfunction
initial
begin
$display("Factorial of 1 = %d", factorial(1));
$display("Factorial of 2 = %d", factorial(2));
$display("Factorial of 3 = %d", factorial(3));
$display("Factorial of 4 = %d", factorial(4));
$display("Factorial of 5 = %d", factorial(5));
end
endmodule
3.
- A选项:set_driving_cell用来设置驱动和负载约束
- B选项:Design Compiler通过变量“link_library”指定例化模块库的位置,target library是用于设置综合时需要映射的库
- C选项:multicycle指定该路径上的信号需要多个周期来传递。false_path会直接跳过对该路径的时序分析
- D选项:setup_output_delay定义了当前设计的输出路径延时值
https://www.micro-ip.com/Synopsys(DC)/dictionary_63_8/set_output_delay.html
4.毫无疑问是的
5. C门控时钟是一种重要的低功耗设计方法
时钟树几乎消耗了整个芯片50%的功耗,因此最好始终在根部产生和关闭时钟。使整个时钟树都关闭。常用基于锁存器的门控时钟
6. 选B
Verilog会自动进行符号的扩展。有号数与无号数的混合计算:不要在同一个verilog叙述中进行有号数与无号数的计算。应该要分成个别独立的叙述。在一个verilog叙述中只要有一个无号数的操作数,整个算式将被当成无号数进行计算。
part-select运算过后的操作数是无号数。就算是选择的范围包含整个register或wire。
以下例子中如果不加
$signed
输出o就不会是有符号数
input [7:0] a;
input signed [7:0] b;
output signed [15:0] o; // Don't do this: assign o = a * b;
// The $signed({1'b0, a}) can convert the unsigned number to signednumber.
assign o = $signed({1'b0, a}) * b;
7. 选B
组合逻辑中使用if条件语句,一定要将else条件补齐全。不然就会出现问题
8.选C
一般情况下:
always 过程块中的组合逻辑使用阻塞赋值
always 过程块中的时序逻辑使用非阻塞赋值
实际上这条规矩是与仿真相关。忽略此规则在综合的时候不会有任何影响。但是在综合前仿真中。仿真的行为会受到影响。导致与综合电路行为不匹配
在时序alway块中使用阻塞赋值,可能导致仿真结果和综合结果不一致。
always @(posedge clk) q2=q1;
always @(posedge clk) q3=q2;
always @(posedge clk) q1=d;
以上代码的综合结果如下:
仿真结果如下:
- A选项:在组合逻辑中使用非阻塞赋值。如果敏感列表添加不全,就会造成仿真错误。如果大量补全了敏感列表,那么反复的进入always 块会拖慢仿真的速度
always @(a or b or c or d) begin
tmp1 <= a & b;
tmp2 <= c & d;
y <= tmp1 | tmp2;
end
- B选项显然是错的
- C选项在时序always块中如果使用阻塞赋值,那么可能会得出与预期不符合的结果
比如我们做一个三级流水线使用以下代码:
always @(posedge clk)
begin
q1=d;
q2=q1;
q3=q2;
end
这个代码生成的结果是
9.答案显然是B
10.单比特wire型信号不用显示定义,所以选A
11. 位宽为256,深度为32选A
12.选C
timing path的起始点有两种:
- 时序器件的时钟输入端,比如D触发器的时钟端
- 电路的输入管脚(input port)
timing path的终点也有两种:
- 时序器件的数据输入端,比如D触发器的D端口
- 电路的输出管脚(output port)
13. 这里D选项是正确的参照下面的说明
14.这里选择B
改善亚稳态的方法
- 降低系统工作时钟,增大系统周期,亚稳态概率就会减小;
- 采用工艺更好的FPGA,也就是Tsu和Th时间较小的FPGA器件;
-
改善时钟质量,用边沿变化快速的时钟信号
15.这题选C
- 综合工具不需要和Formal工具配套
16.选B
`deine是宏定义。可以定义在模块内,也可以定义在模块外。但是它的作用范围是整个工程。而parameter的作用范围只有模块内部。所以我们推荐使用parameter做状态机编码。而不是`define。但是理论上`define也可以用来定义状态机编码。
`define用法如下,使用定义的字符串时需要加上符号
`define IDLE 4'b0001
wire [3:0] output;
assign output = `IDLE
19.选C
常见状态机及定义:
- 一段式:整个状态机写到一个always模块里面,在该模块中既描述状态转移,又描述状态的输入和输出;
- 二段式:用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出;
- 三段式:在两个always模块描述方法基础上,使用三个always模块,一个always模块采用同步时序描述状态转移,一个always采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。
20.
21.
这题选B
25. C
26.D
28. 目测选B
29.错误,这是一个自加逻辑。如果定义为wire,那么就没有时钟控制。这样以来就会无限自加
30. 选D
形式化验证方法在IC设计中的应用很普遍。形式化验证是基于数学方法的定理证明,用来验证设计的逻辑等价性。主要完成等价性检查。特别是当RTL代码完成综合后其function功能会发生改变。所以这里我们采用形式化验证的方法来检查RTL和门级网表的等价性
31.这题选D
这里的两个信号具有相互关系,如果原信号的两位变化时就有偏差。那么同步以后。很有可能就会有一个周期的偏差
32. 选正确
组合逻辑中的if-else语句如果缺少条件分支,那么就会产生latch
34.选A
- A选项:DRAM是动态内存,只需要一个MOS管一个电容即可。但是一个SRAM单元是两个反相器交叉耦合而成。需要的晶体管数目起码是6个。所以结构更复杂
- B选项:DRAM需要时时刷新,因为电容会漏电。但是SRAM不用刷新。
- C选项:DRAM成本低常用做内存。SRAM用作CACHE成本高
- D选项: 显然SRAM速度更快
35.这题选B
fork是多线程的操作符
37.
Tmin=Tco + Tlogic + Tsetup = 6 + 2 + 2=10 ns
f = 100Mhz
38.这题选D
一般多位异步信号处理有以下方式:
- 使用格雷码传递多位信号
- 采用握手协议
- 采用FIFO进行缓存
所以这里的直接打拍处理显得很业余
39.短路功耗和开关功耗同属动态功耗故正确
40.形式验证
形式验证在ASIC设计流程中犹如一个迭代算法,其最初的输入是RTL设计,每次比较,都将上一次比较后的设计(第n-1次)作为参照设计处理之后的结果(第n次)进行比较,之所以这么做,是基于以下考虑:
1.形式验证工具开始比较前,首先在两个设计中找到一一对应的比较点。
2.如果一个设计改动太大,改变前后的功能是完全一致的,但如果形式验证工具无法找到适合的比较点,也会认为这两个设计不等价。 形式验证在 ASIC设计流程中主要应用在以下几个方面:RTL-RTL的对比,RTL-GATE的对比,GATE-GATE的对比。采用形式验证进行RTL与RTL 的比较,可以在较短的时间内验证并保证代码修改的过程中没有引入功能性的错误;进行RTL与GATE的对比,是验证源代码与综合之后的门级网表是否等价,以保证综合过程中不会出现任何错误;进行GATE与GATE的对比,主要是发生在验证插入DFT后的电路网表在功能上是否一致;生成时钟树前后的电路网表在功能上是否一致;布局布线前后的电路网表在功能上是否一致等。
多选题:
1.ACD 是正确答案
2.ABCD
覆盖率分析
代码覆盖率:
- 行覆盖率
- 条件覆盖率
- FSM覆盖率
- 翻转覆盖率(toggle)
功能覆盖率
断言覆盖率
3.答案是ACD
参考模型设计,checker设计,规格设计都是验证工程师的工作
4. AB
这是RTL设计的原则
- 组合逻辑和时序逻辑分开描述
- 先电路后代码
- 数据和控制分开原则