Dinglei_hello · 2021年11月15日

Verilog 面试问题

1、Verilog task 和Verilog function有什么区别?

1.function应在一个仿真时间单元内执行,task可以包含时序控制语句。
2.function无法启用task,task可以启用其他task或function。
3.function应返回一个单个值,task没有返回值。

2、给定以下Verilog 代码,“a”会打印什么值?

always @(posedge clk) begin
a = 0;
a <= 1;
$display(a);
end

这是一个很tricky 的问题!Verilog调度语义意味着当前仿真时间存在一个4级的仿真队列:

1: Active Events (blocking statements)
2: Inactive Events (#0 delays, etc)
3: Non-Blocking Assign Updates (non-blocking statements)
4: Monitor Events ($display, $monitor, etc).

由于“a=0”是一个 active event,因此它被安排到第一个“队列”中。“a<=1”中的RHS是一个non-blocking event,因此它被放入第三个队列中。最后,将display 语句放入第4个队列中。只有monitor event队列中的事件完成了才进入到后面的仿真时间。因此,“a=0”会发生,然后显示一个\=0。如果我们在下一个仿真时间中查看a的值,它将显示1。

3、以下两行Verilog代码有什么区别?

#5 a = b;
 a = #5 b;

#5 a=b;等待5个时间单位后再执行“a=b;”的操作。因此,a的值是时间单位5时b的值。a = #5 b; b的值被计算并存储在内部临时寄存器中,在五个时间单位后,将此存储的值赋值给a。a的值为b在时间单位为0时的值。

4、

c = foo ? a : b;

if (foo) c = a;

的区别是?

当foo = 1'bx, a = 'b1, and b = 'b0时,

c = foo ? a : b;

会得到“x”

if (foo) c = a;
else c = b;

会得到“0”

5.请问至少需要深度为多少的FIFO?

两个系统(SystemA和SystemB),使用两个不同的时钟clkA(100MHz)和clkB(70MHz)。这两个时钟彼此之间都是异步的。数据必须从SystemA传递到SystemB。

SystemA能够在100个时钟周期内写入70个word的数据,而SystemB在每个时钟周期都能够读取一个word的数据。请为上述规格设计一个具有最小深度的FIFO。

为了避免溢出(即由于FIFO写快读满导致写入的数据被覆盖),我们需要计算在最坏情况下FIFO所需的深度。

对于SystemA 100个时钟可以写入70个word数据,这意味最快可以在70个时钟周期内完成数据传输,另外30个时钟周期处于空闲状态。而最坏情况下从第101个时钟周期开始又连续传输70个word数据。

<---30---><---70---><---70---><---30--->
<--first burst-----><---second burst--->

根据最坏的情况,在两次共140个数据写入期间可以读出数据为:

140*(1/100MHz)*70MHz *1 = 98word

所以在140次写数据期间最多只能读98次。剩下的数据呢?它不应该丢失。我们需要把它们保存在FIFO中,所以FIFO的最小深度应该是

140-98 = 42
作者:验证哥布林
原文链接: https://mp.weixin.qq.com/s/FWJsmsHI7MMCSIuAFFDbHw
https://mp.weixin.qq.com/s/l4DRdAs-cpWy0JiG3L8Uxg
微信公众号:
 title=

推荐阅读

更多IC设计技术干货请关注IC设计技术专栏
推荐阅读
关注数
10971
内容数
1216
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息