面试官(高冷脸):说说离职原因?(内心os:看看你小子是不是也被裁了还是初生牛犊不知道当今环境的恶劣在这玩裸辞)
我(已读乱回):如果可以,我想和它回到那天相遇,让时间停止那场面试,红线划过拒绝offer的按钮,我用尽全力。–改自歌曲《如果可以》(内心os:挥手错的才能和对的相拥)
IC验证面试经验分享
- Verilog篇
- 1.同步复位、异步复位、异步复位同步释放
- 2.亚稳态
- 1)建立时间,保持时间
- 2)亚稳态的产生
- 3)亚稳态的结果
- 3.跨时钟域处理
- 1) 对于单bit信号
- 慢时钟域到快时钟域
- 快时钟域到慢时钟域:
- 打两拍就一定能消除亚稳态吗?
- 3) 对于多bit信号:
- 格雷码为什么可以?
- 格雷码的编码在异步fifo设计中是把什么用格雷码编码:
- 4.毛刺
- 总结
好久没更新了,因为博主忙于面试实在是无暇整理更新,也不知道有没有掉粉,裸辞一个月拿下新offer,火速开启新的牛马生活了。之前感觉软件的面经满天飞,IC的面经还是略显小众,并且免费的帖子更少了,借此机会给大家分享一下面经,不用太感谢博主哈哈哈(自豪脸),那就开始把!
Verilog篇
作为一个合格的IC验证er,技能树上必然缺不了Verilog,这不一定是验证面试的重点,但是验证不是目的,不过是对设计的手段,所以最后还是回回归Verilog设计,这也是会在很多面试官的考察范围内的。这里只整理被常问的几大问题,欢迎补充
1.同步复位、异步复位、异步复位同步释放
- 同步复位:
只有时钟上升沿到来,复位信号才能产生有效的变化
。- 优点
- 一般能保证电路是同步的
- 确保复位只发生再时钟有效沿,可以过滤毛刺
- 缺点
- 复位信号的有效时长必须大于时钟周期,才能完成复位
- 目前大部分触发器都有异步复位接口,采用同步复位相对耗费逻辑资源
- 优点
module dff_sync(
input clk,
input d,
input r_n,
output q);
always @(posedge clk) begin
if(!r_n)
q <= 0;
else
q <=d ;
end
endmodule
- 异步复位:
无论时钟边沿到来与否,只要复位信号有效输出就会被复位。(与时钟没有关系
)。- 优点
- 设计相对简单
- 大部分器件库的触发器都有异步复位的端口,节省资源
- 缺点
- 复位信号释放时容易出现亚稳态的问题
- 复位信号释放时容易出现亚稳态的问题
- 优点
module dff_async(
input clk,
input d,
input ar_n,
output q);
always @(posedge clk or ar_n) begin
if(!ar_n)
q <= 0;
else
q <=d ;
end
endmodule
- 异步复位同步释放:
复位是异步的,但是释放是同步的
,实现原理就是用两个D触发器打两拍实现两级同步,第一个D触发器的输入口D固定为1。- 优点
- 兼具了同步复位和异步复位的优点,也解决了他们的缺点
- 相比同步复位,不需要复位信号时长大于时钟周期,因为复位是异步的
- 相比异步复位,可以解决亚稳态问题,因为释放是同步的
- 优点
module dff_sync_async(input clk,
input r_n,
output rst_syn_n);
reg reg1, reg2;
always @(posedge clock or negedge r_n) begin
if(!r_n) begin
reg1 <= 1'b0;
reg2 <= 1'b0; //异步复位
end
else begin
reg1 <= 1'b1;
reg2 <= reg1; //同步释放
end
end
assign rst_sync_n = reg2;
endmodule
2.亚稳态
围绕亚稳态一般是必问的问题,尤其是下面的跨时钟域处理,想知道亚稳态必须先知道建立时间和保持时间的概念。
1)建立时间,保持时间
建立时间Tsu:时钟有效沿到来之前数据必须保持稳定的最小时间;
保持时间Th:时钟有效沿到来之后数据必须保持稳定的最小时间;
这里学习期间还遇到容易混淆的概念:
- 同步系统中会涉及到
建立和保持时间
,因为无论是控制信号还是数据信号,都需要提前保持稳定,等待CLK触发,再继续保持稳定,触发器的输出才是稳定的。 - 异步系统中会涉及到后
恢复和去除时间
,因为某一个时钟上升沿到底能否有效驱动工作,取决于时钟信号和复位信号之间是否满足恢复时间或者去除时间。)
2)亚稳态的产生
亚稳态的产生:不满足建立时间和保持时间,不满足恢复时间和移除时间。
3)亚稳态的结果
亚稳态是触发器的一个固有特性,正常采样也会有一个亚稳态时间,所以亚稳态并不会完全消除
。当建立时间和保持时间满足时,触发器也会经历采样---亚稳态---稳定输出
的一个过程。
而出现亚稳态问题时,亚稳态(也就是中间态)时间变长,最终输出稳定但无法保证正确(虽然你输出的是稳定的标准电平信号,但难以保证是输入对应输出)。
之前看过一个亚稳态的后果的一个很好的解释,说给大家听:
触发器的类似于一个球在一个光滑的山上滚动,上山和下山的两边山底是稳定状态,假设左边是稳态0,右边是稳态1,而山顶就是亚稳态的状态。
-
当上山的推力足够,也就是
满足建立时间和保持时间
,那么不会出现亚稳态问题,球能顺利从稳态0到稳态1; -
但是如果推力不足,也就是
不满足建立时间和保持时间
,那么可能出现两种情况:- (1)球抵达山顶,过一段时间顺利下山,达到稳态1,但是会造成延迟稳定时间;
- (2)球没到山顶或者刚到就折返回了山下,回到了稳态0,那就不能保证是结果的正确。
3.跨时钟域处理
接下来就到了逢面必问的问题了,也可以说时亚稳态的处理,让我们逐一分析其中的知识点,每一个都很重要。
1) 对于单bit信号
慢时钟域到快时钟域
- 解决办法:
两级同步
,打两拍 - 要求:
目标时钟域频率比源时钟域频率高1.5倍以上
, 并且源时钟域数据adata为持续时间较长的电平信号,能确保被目标时钟域采到。通常来说,如果时钟域bclk的频率是aclk频率的1.5倍以上,那么通过“打两拍”的方式进行同步)
快时钟域到慢时钟域:
- 解决办法:脉冲展宽,然后进行边沿检测和两级同步
打两拍就一定能消除亚稳态吗?
只是消减或降低概率,亚稳态是触发器的一个固有特性,正常采样也会有一个亚稳态时间。前文已解释)
3) 对于多bit信号:
- 解决办法:格雷码+两级同步,常见于异步fifo的设计中
格雷码为什么可以?
-
为什么需要格雷码
- 使用DFF打两拍可以基本消除亚稳态的问题,但是如果要采样的是一个
多bit的跨时钟域信号
,比如4bit信号,那么由于建立时间和保持时间的不满足,虽然在打两拍之后可以得到一个稳定的数据,但数据的每一个bit都不一定是正确的,其可能的值有2^4=16种
,这显然是无法保证正确的数据。
- 使用DFF打两拍可以基本消除亚稳态的问题,但是如果要采样的是一个
-
格雷码的特点
- 格雷码相邻的
两个编码之间只有一位是不一样的
。 - 因此,在进行跨时钟域传输时,
只有发生变化的那个bit有可能处于亚稳态
,而其余bit由于保持不变,因此是稳定的,故多比特格雷码的跨时钟域传输相当于单比特信号的跨时钟域传输
,我们再采用打两拍的方法即可处理。
- 格雷码相邻的
格雷码的编码在异步fifo设计中是把什么用格雷码编码:
异步fifo的地址用格雷码编码
4.毛刺
因为亚稳态和毛刺我初学时会分不清二者,所以这里加一个,不过面试中问毛刺的貌似不多。
毛刺的产生
:信号由于经由不同路径传输达到某一汇合点的时间有先有后的现象,就称之为竞争
,英文名Race;由于竞争现象所引起的电路输出发生瞬间错误的现象,就称之为冒险
,英文名Hazard或者Risk。有竞争不一定有冒险,但出现了冒险就一定存在竞争。发生冒险时往往会出现一些不正确的尖峰信号,这些尖峰信号就是“毛刺”毛刺的消除
:一般采用非阻塞赋值等
总结
不知不觉码字俩小时了,时间有限今天就先梳理Verilog篇吧,后续还有SV、UVM、协议篇,敬请期待嘻嘻。