笔试总结(七)

在这里插入图片描述

下面代码,b和c的值是多少?

a = 10;
b = a++;
c = ++a;

b=10,c=12。后置自增运算符仅在赋值后才进行自增,因此b得到的是自增前的值。前置增量运算符将首先进行自增,因此a将从11增加到12。

根据输入的n计算斐波那契数列
斐波那切数列是一种数列,每一项是通过将前两项相加得到的。从0和1开始,顺序为0,1,1,2,3,5,8,13…依次类推。通常,表达式为xn=xn-1 + xn-2。假设n的最大值为n=256,以下代码将生成第n个斐波拉契数。值n作为输入传递给模块。

module fibonacci(
	input clk,
	input rst_n,
	input [7:0] nth_number,
	output [19:0] fibo_number,
	output number_ready
);


reg [19:0] previous_value;
reg [19:0] current_value;
reg number_ready_r;
reg [7:0] internal_count;

always @ (posedge clk or negedge rst_n) begin
	if(!rst_n) begin
		previous_value <= 'd0;
		current_value <= 'd1;
		internal_count <= 'd1;
		number_ready_r <= 1'd0;
	end
	else begin
		if(internal_count==(nth_number-2)) begin
			number_ready_r <= 1'b1;
		end
		else begin
			internal_count <= internal_count + 1'b1;
			current_value <= current_value + previous_value;
			previous_value <= current_value;
			number_ready_r <= 1'b0;
		end
	end
end

assign fibo_number = current_value;
assign number_ready = number_ready_r;

endmodule

verilog中task和function有什么区别?
(1)function不能使用任何延迟语句,task可以
(2)function可以调用function,但是不能调用task。task可以调用task和function
(3)function可以综合,task不可以
(4)function需要有通过返回参数作为输出,但是有多个输入输出参数。task不能有返回值,但是具有多个输入或者输出参数。

systemverilog中的reg,wire和logic有什么区别?
reg和wire是verilog中就存在的两种数据类型,而logic是systemverilog中引入的新数据类型。
(1)wire是一种数据类型,可以多对物理导线进行建模以连接两个元素。导线只能由连续赋值语句驱动,如果不驱动,则无法保持值。因此,wire只能用于对组合逻辑进行建模。
(2)reg是可以存储数据或状态建模的数据类型。它们需要由always块驱动,而不能由连续赋值驱动,reg可以用来建模顺序逻辑和组合逻辑。
(3)legic是systemverilog中的一种新数据类型,可用于wire和reg建模,也是四值逻辑,可以被用作reg也可以wire。

bit和logic有什么区别?
bit是只能存储0和1的二值逻辑,而logic能够存储0,1,x和z的四值逻辑。
二值逻辑能够加速仿真速度,而如果用二值逻辑用于驱动或者采样来自RTL的信号,会导致错误采样x和z。

systemverilog中case,casex和casez的区别是?
case语句是选择语句,匹配表达式并执行对应的语句。下面是一个3:1MUX

case(select[1:0])
	2'b00 : out_sig <= in0;
	2'b01 : out_sig <= in1;
	2'b10 : out_sig <= in2;
	default : out_sig <= 'x;
endcase

如果表达式与指定的内容完全匹配,则执行后续语句,如果出现x或者z,则执行默认语句。

casez是case的一个特殊版本,通常在处理较少位的译码器中使用。下面的示例中,将3位中断申请队列解码位三个独立的中断引脚,只关心对应位,而其他位无关紧要。带有优先级。

casez(irq)
	3'b1?? : int2 = 1'b1;
	3'b?1? : int1 = 1'b1;
	3'b??1 : int0 = 1'b1;
endcase

casex是另一个特殊版本,除了无关项,在比较中,它也忽略x和z值。

定向测试和受约束的随机测试有什么区别?两者有什么优缺点?
定向测试是一种编写定向测试来验证设计中的每个特性的方法。约束随机测试是一种使用约束随机生成器自动生成激励的方法,该生成器根据设计规范生成激励。下表比较了两者的优缺点。推荐的方法是混合使用这两种方法-----约束随机覆盖大部分验证空间,然后定向测试覆盖难以到达的边界条件。
在这里插入图片描述
单端口和双端口RAM有什么区别?
单个端口RAM只有一个读和写端口。所以它只能在任何给定的时间点进行读或写操作。
一个双端口RAM有两个读/写端口,因此允许同时读写。

形式验证是静态仿真还是动态仿真?
是静态仿真。

形式验证有哪些方法?
(1)模型检查
(2)形式等效

解释模型检查?
在“模型检查”方法中,将要验证的模型描述为从设计规范中提取一组property。因此要详尽搜索设计的状态空间,检查所有property是否在所有状态下均成立。如果在任何状态下违反了property,则会引发错误。下图是一个示意图:
在这里插入图片描述
什么是形式等效?
形式等效用于验证两个具有相同或者不同抽象的模型在功能上是否一致的方法。此方法无法确定模型在功能上是否正确,但是可以确定两个模型在功能上是否相同。常用于比较RTL设计和综合网表的功能。它也可以用来检查两个RTL模型或者两个门级模型的一致性。下图是一个示意图:
在这里插入图片描述
CMOS电路功耗由哪些部分组成?
(1)动态功耗:这部分是由晶体管电容充放电产生的。
(2)静态功耗:这部分是由开关的漏电流产生的。

什么是多电压域?为什么要用它?
多电压域是一种低功耗技术,它是设计中使用多个电压域。在此,它的目标是针对所需性能优化功耗。电压越高,电路速度越快(性能越高),但是功耗也越高(因为动态功耗PD与CV^2f成正比)。在某些设计中,设计的只有几个部分可能需要以较高的频率运行,而其他部分可以较低的频率运行。在这种情况下,给低频率部分提供低电压,从而减小功耗。

什么是动态电压频率调节(DVFS)?何时使用?
动态电压频率调节是一种低功耗设计技术,通过动态调整频率降低功耗。在DVFS中,工作频率或电压以某种方式进行调节,使得设计在正常运行的同时使用最小的频率或电压。这个过程发生在设计的运行过程中,因此称为动态。传统的低功耗方法中,设计以工作频率运行,然后再空闲时关闭电源进行定期调度。DVFS技术利用了CMOS芯片的特性:CMOS芯片的能量消耗正比于电压的平方和时钟频率。DVFS技术是以延长任务执行时间为代价从而减少系统能量消耗的目的,体现了功耗与性能之间的权衡。可以通过减少时钟频率来降低通用处理器功耗的。然而,仅仅降低时钟频率并不节约能量,因为性能的降低会带来任务执行时间的增加。调节电压需要以相同的比例调节频率以满足信号传播延迟要求。然而不管是电压调节还是频率调节,都会造成系统性能的损失,并增加系统的响应延迟。

为了尽量减少可感知的系统性能负面影响同时又能最大程度地降低系统能耗,策略必须估计未来的工作负载并选择最合适的频率。准确地预测未来的工作负载对广泛使用的策略是至关重要的。预测错误可能会导致设置的频率太高降低节省能耗,或设置频率过低造成系统响应延迟过高。所以要想降低功耗,需要选择合适的供电电压和时钟频率。
所以安全的调节机制是:
(1)当需要提升功率时,应先提升供电电压,然后提升时钟频率
(2)当需要降低功率时,应先降低时钟频率,再降低供电电压

制定调整策略前,需要先找出系统中的耗电大的部件,如CPU、GPU、DSP等硬件算法加速模块(结合逻辑规模),然后统计出这些模块的负载情况,基本的策略当然是工作负载增加则省频升压,工作负载降低则降频降压。工作负载的粗略模型是在一个时间窗口内,统计模块工作的时间长度,设定不同阈值,高阈值对应高电压高频率,低阈值对应低电平低频率。每次统计值穿过阈值边界,触发DVFS转换。

多时钟域设计会遇到哪些问题?
(1)亚稳态导致同步失败:时钟在不同的时钟域以不同的频率运行,并且在一个时钟域中生成的信号在非常接近第二个时钟域中时钟有效沿的位置采样时,输出可能进入亚稳态,在设计中出现同步失败。
(2)数据不一致:如果设计不合理,目标时钟域可能会接收错误的数据。例如:如果有多个信号从一个时钟域传输到另一个时钟域,所有这些信号同时变化,并且源和目标时钟彼此接近,那么这些信号中某些可能会在这个时钟周期捕获,而有些信号可能在另一个时钟周期中被捕获,从而导致数据不一致。注意:这只是数据不一致的一个例子,数据不一致的产生还有很多原因。
(3)数据丢失:如果设计不合理,则数据可能会在CDC边界丢失。例如:如果信号从比较快的时钟域发送到较慢的时钟域,并且该信号的宽度仅有一个时钟周期(较快的时钟),则可能会丢失以下信息:信号在较慢的时钟域中的采样沿前就变了。注意:这只是数据丢失的一个例子,数据丢失的产生还有很多原因。

如何处理跨时钟域信号?
跨时钟域处理有很多方法,具体取决于我们需要在不同的时钟域之间传递1位还是多位。假设一下情况:多个信号从一个时钟域传输到另一个时钟域,所有信号同时变化,并且源和目标活动时钟沿彼此接近。在这种情况下,这些信号中某些信号可能在目标时钟域的一个时钟周期中被捕获,而另一些信号在目标时钟域中的另一个时钟周期中被捕获,从而导致数据不一致性,可以使用下面方法在两个时钟域之间同步信号。

对于单bit跨时钟域:
(1)两级或者三级同步器
(2)使用握手信号进行同步

对于多bit跨时钟域:
(1)使用多周期路径的方法进行同步,将未经同步的信号和同步控制信号一起发射到目标时钟域
(2)对信号使用格雷码编码,由于相邻的格雷码计数只会有变化一个bit,亚稳态的发生会大大减小
(3)使用异步FIFO
(4)将多bit信号合并成1bit,然后再通过多级同步器进行传输
(5)使用DMUX

异步复位的优缺点有哪些?
优点:
(1)异步复位具有最高优先级
(2)保证数据路径干净
(3)有或没有时钟的情况下都会生效
缺点:
(1)如果在时钟的有效沿(或附近)撤销异步复位,则触发器的输出可能会进入亚稳态
(2)它对毛刺很敏感,可能会导致虚假的复位

同步复位的优缺点有哪些?
优点:
(1)整个电路都是同步的
(2)更加容易仿真
(3)综合以后可能会更加节省面积
缺点:
(1)需要脉冲扩展,让复位脉冲足够长,保证能够正确地被采样
(2)会添加额外的组合逻辑
(3)同步复位需要有时钟才能复位。如果电路具有内部三态总线,则需要单独的异步复位,以防止内部三态总线上的总线冲突。

什么是reset recovery time?和复位有什么关系?
复位恢复时间是复位解除和时钟信号有效沿之间的关系。如果发生复位解除,并且在非常小的时间窗口内,如果时钟信号边沿来临,则可能导致亚稳态。这是因为复位解除置位后所有信号将不满足下一个触发器输入的时序条件。

什么是PLL?
PLL的全称是“Phase Locked Loop,即锁相环”。简而言之,它是一种反馈电路(准确的说是控制系统),用于生成输出信号,该输出信号的相位与输入信号的相位有关。它用于相位/频率调制和解调,还可以用作频率合成器。PLL由三个功能组成:
鉴相器
环路滤波器
压控振荡器

在这里插入图片描述
如果功能覆盖率接近100%而代码覆盖率不足60%,说明了什么?
仿真器会基于testcase提取代码覆盖率,而功能覆盖率则是用户定义的指标。低代码覆盖率表明并非设计代码的所有部分都经过了测试。高功能覆盖率表明,用户从测试计划中捕获的所有功能都得到了测试。如果覆盖率指标显示低代码覆盖率和高功能覆盖率,原因可能是:
(1)可能有许多设计代码未按照spec用于实现的功能(无效的代码)
(2)用户定义的功能覆盖率中存在一些错误。测试计划未捕获所有设计功能、场景、边界,或者缺少功能覆盖率监视器。代码覆盖率中未覆盖的设计代码可能会映射到这些功能上。
(3)在实现功能覆盖率监视器时可能存在一些潜在的错误,导致它们收集了错误的覆盖率。因此,在验证项目中,对用户定义的功能覆盖率指标及其实现进行适当的检查很重要。

如果代码覆盖率接近100%而功能覆盖率不足60%,说明了什么?
(1)没有按照spec在设计中实现了所有功能。因此,设计代码无法实现所有功能
(2)在功能覆盖率监视器中可能存在潜在的错误,即使设计代码实现了功能,也无法覆盖它们。
(3)功能正确,但是由于发送的激励不正确,对应的功能覆盖率无法收集

猜你喜欢

转载自blog.csdn.net/weixin_43727437/article/details/107313834