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
微信公众号:
推荐阅读
更多IC设计技术干货请关注IC设计技术专栏