内容简介
《RTL设计师面试攻略》从RTL设计师视角出发,系统梳理ASIC/VLSI行业标准工作流程中的关键知识与面试要点,通过分享行业经验与*特视角,帮助读者理解企业所需技能,提升面试竞争力,斩获心仪职位。
《RTL设计师面试攻略》分为三大部分:**部分围绕架构与微架构展开,涵盖CPU流水线、CPU乱序调度、虚拟内存和TLB、缓存一致性、FIFO、CDC、LRU算法、重排序、仲裁器、数字分频器、算术逻辑设计、序列产生器等;第二部分聚焦验证、实现、综合与功耗,详细讲解设计验证、形式验证、CDC检查、RDC检查、ECO流程等;第三部分涉及物理设计和芯片调试,包括STA、SDC、时序ECO等;同时在末尾分享行为类问题及实用面试建议等。
精彩书摘
**部分 架构与微架构
**章架构与原型
1.1 CPU流水线
【问题1】MIPS五级流水线是什么样的?
答MIPS五级流水线是阐释CPU流水线技术的**简化模型,也是面向应届生和初级工程师的常见面试题。该流水线包含取指(instruction fetch,IF)阶段、指令解码(instruction decode,ID)阶段、指令执行(instruction execution,EX)阶段、内存访问(memory access,MEM)阶段、回写(write back,WB)阶段[1]。
1.IF
IF阶段可用如下公式概括:
IR<-Mem[PC]
PC <-PC+4
其中,PC(program counter)表示程序计数器(或下一条指令的地址);IR(instruction register)表示存储待执行的指令。在此阶段,CPU根据PC值获取指令,同时PC会自动指向下一条指令(假设每条指令占4字节)。
2.ID
ID阶段可用如下公式概括:
A<-Regs[IR[10:6]]
B<-Regs[IR[15:11]]
Imm<-IR[15:0]
其中,A和B为操作数;Imm为立即数;Regs为寄存器文件。
在这一级,CPU使用IR[10:6]和IR[15:11]作为寄存器索引从寄存器文件 中读取操作数,或从IR[15:0]中提取立即数。
3.EX
EX阶段可用如下公式概括:
ALU输出<-A+Imm(计算内存操作的有效内存地址)
ALU输出<-A op B(寄存器间操作)
ALU输出<-A op Imm(寄存器与立即数间操作)
ALU输出<-PC+Imm(计算分支指令的目标地址)
其中,op是指令定义的某种运算操作。
在此阶段,ALU可用于计算内存操作的有效地址、执行寄存器间或寄存器 与立即数之间的运算操作,或计算分支指令的目标地址。分支条件的判定也在 此阶段完成。
4.MEM
MEM阶段可用如下公式概括:
LMD<-MEM[ALU输出](内存加载)
MEM[ALU输出]<-B(内存存储操作)if(条件满足)PC<-ALU输出else PC<-PC+4
其中,LMD是流水线寄存器,用于暂存从内存加载的数据。
在此阶段将执行内存加载/存储操作。分支操作*终也在此周期内完成。若EX阶段判定的分支条件成立,则将PC更新为EX阶段ALU输出的目标地址,实现程序的跳转;否则程序继续顺序执行,PC自动指向下一条指令(PC+4)。
5.WB
WB阶段可通过如下公式概括:
Regs[IR[20:16]]<-ALU输出(寄存器间操作)
Regs[IR[15:11]]<-ALU输出(寄存器与立即数间操作)Regs[IR[15:11]]<-LMD(内存加载)
在此阶段,*终结果写回寄存器文件。对于寄存器间操作,将ALU运算 结果写人IR[20:16]指定的目标寄存器;对于寄存器与立即数间操作,将ALU
运算结果写人IR[15:11]指定的目标寄存器;对于内存加载,将从内存读取的 数据(LMD)写人IR[15:11]指定的目标寄存器。
结论:MIPS五级流水线是硬件工程师面试的**知识。面试官通常期望 应聘者能够透彻理解流水线每个阶段的具体功能。
【问题2】流水线冒险及解决方案——基于MIPS五级流水线的案例 分析
答CPU流水线技术虽然能提升吞吐量并实现更高的时钟频率,但并非没 有代价。当多条指令并行执行时,CPU设计者必须解决以下三类冒险:
?结构冒险(structural hazards)。
?数据冒险(data hazards)。
?控制冒险(control hazards)。
本节将详细讨论这些冒险,并结合MIPS五级流水线进行案例研究[1 ]。
1.结构冒险
结构冒险源于硬件资源竞争一当多条指令试图同时访问同一组硬件资源 时就会导致冲突问题的产生。这些资源包括寄存器文件和内存资源。
同一时钟周期内,ID阶段指令需要读取寄存器文件,而WB阶段指令需 要写人寄存器文件。若寄存器文件只有一个端口,则会发生结构冒险。面对这 样的问题,可以将时钟周期划分为前半周期(读操作)和后半周期(写操作)来解决,而更优的方案是为寄存器文件配置*立的读写访问端口。
同一时钟周期内,IF阶段需要从内存读取指令,而同时MEM阶段需要加 载/存储数据,若指令和数据共享同一存储器,则会发生冲突。面对这样的问题,可以采用分离的指令存储器和数据存储器来解决。在现代的计算机体系结构中,这几乎是默认的设计方案一CPU中通常配置*立的L1指令缓存和L1数据缓存。
2.数据冒险
数据冒险发生在试图访问尚未有可用数据时。数据冒险共有三种类型:
?写后读(RAW)。
?读后写(WAR)。
?写后写(WAW)。
在这三种数据冒险中,只有RAW表示真正的数据依赖关系,其余两种仅为名称依赖。在MIPS五级流水线中,WB阶段始终位于ID阶段之后,因此 WAR和WAW在此情况下不会发生
目录
目录
**部分 架构与微架构
第1章 架构与原型 2
1.1 CPU流水线 2
【问题1】MIPS五级流水线是什么样的? 2
【问题2】流水线冒险及解决方案——基于MIPS五级流水线的案例分析 4
【问题3】能否任意增加CPU流水线的深度? 6
【问题4】如何实现基于硬件的分支预测? 7
1.2 CPU乱序调度 9
【问题5】Tomasulo算法如何工作? 9
【问题6】Tomasulo算法中如何处理内存引起的数据依赖? 11
【问题7】如何通过内存处理数据依赖? 12
【问题8】如何在Tomasulo算法中实现基于硬件的推测以*小化控制冒险? 16
1.3 虚拟内存和TLB 19
【问题9】使用虚拟内存有哪些好处? 19
【问题10】虚拟地址如何转换? 19
【问题11】为什么需要TLB? 20
【问题12】如何处理TLB 缺失? 21
【问题13】如何处理缺页异常? 21
1.4 精确中断的实现 21
【问题14】什么是精确中断?什么是非精确中断? 21
【问题15】如何实现精确中断? 22
1.5 缓存 25
【问题16】为什么需要缓存? 25
【问题17】什么是缓存冲突? 27
【问题18】缓存中的读/写/替换策略是什么? 27
【问题19】如何衡量缓存性能? 29
【问题20】为什么缓存增大后性能没有提升? 30
【问题21】用虚拟地址访问缓存会有什么问题? 30
【问题22】根据索引位和标签(tag)位,缓存有哪些类型? 31
1.6 缓存一致性 33
【问题23】什么是NUMA/UMA架构? 33
【问题24】什么是缓存一致性? 34
【问题25】如何实现缓存一致性? 34
【问题26】你能展示基于侦听的MSI 协议状态转换吗? 35
【问题27】什么是MESI/MEOSI/MEOFSI协议? 37
【问题28】如何为MESI协议实现主目录? 38
1.7 通用片上总线协议 39
【问题29】能描述一下APB协议的工作原理吗? 39
【问题30】能描述一下AHB协议的工作原理吗? 42
【问题31】能描述一下AXI协议的工作原理吗? 44
【问题32】为什么AXI和AHB 协议提供回环突发传输? 45
【问题33】AXI协议中通道之间有哪些依赖关系? 46
【问题34】如何强制AXI写通道和读通道间的顺序? 46
【问题35】AXI协议中的*占访问是什么? 47
第2章 微架构设计 48
2.1 Verilog语法与原语 48
【问题36】阻塞赋值与非阻塞赋值有什么区别? 48
【问题37】如何检测和解决与X相关的RTL 问题? 48
【问题38】casex、casez和case-inside有什么区别? 49
【问题39】使用SystemVerilog的signed数据类型时需要注意什么? 50
【问题40】“===”和“==”有什么区别? 51
【问题41】什么是delta 仿真时间? 51
【问题42】什么是通用逻辑门? 52
2.2 握手协议 54
【问题43】什么是valid-ready协议? 54
【问题44】什么是valid-ready切片? 54
【问题45】如何将4 相req-ack协议转换为valid-ready协议? 57
【问题46】如何将valid-ready协议转换为4相req-ack协议? 57
2.3 FIFO 58
【问题47】如何设计基于触发器的非2 次幂深度的同步FIFO? 58
【问题48】如何设计一个支持2 次写入1 次读取的基于触发器的同步FIFO 58
【问题49】如何基于双端口SRAM设计同步FIFO? 59
【问题50】如何设计基于触发器的异步FIFO? 62
【问题51】如何设计一个非2 次幂偶数深度的异步FIFO 62
【问题52】设计一个基于SRAM 的异步FIFO 62
2.4 跨时钟域(CDC) 63
【问题53】什么是亚稳态? 63
【问题54】什么是MTBF?为什么同步器能处理CDC 问题? 63
【问题55】传输脉冲信号时有哪些常见的CDC 注意事项? 64
【问题56】传输多比特信号时有哪些常见的CDC 注意事项? 64
2.5 LRU算法 65
【问题57】如何实现真正的LRU 算法? 65
【问题58】如何实现伪LRU? 66
2.6 重排序 67
【问题59】支持有序读响应功能的内存控制器设计(Ⅰ) 67
【问题60】支持有序读响应功能的内存控制器设计(Ⅱ) 69
2.7 查找表 69
【问题61】使用一维LUT(查找表)实现y = f(x) 函数 69
【问题62】使用二维查找表实现z = f(x, y) 函数 71
2.8 仲裁器 72
【问题63】设计一个固定优先级仲裁器 72
【问题64】设计一个轮询仲裁器 72
【问题65】设计一个基于优先级的仲裁器 73
2.9 数字分频器 74
【问题66】实现任意整数N 的分频器(无占空比要求) 74
【问题67】实现2N 分频器(50% 占空比) 74
【问题68】实现2N 分频器(50% 占空比) 74
【问题69】实现(2N+1) 分频器(50% 占空比) 75
试读
**部分 架构与微架构
**章架构与原型
1.1 CPU流水线
【问题1】MIPS五级流水线是什么样的?
答MIPS五级流水线是阐释CPU流水线技术的**简化模型,也是面向应届生和初级工程师的常见面试题。该流水线包含取指(instruction fetch,IF)阶段、指令解码(instruction decode,ID)阶段、指令执行(instruction execution,EX)阶段、内存访问(memory access,MEM)阶段、回写(write back,WB)阶段[1]。
1.IF
IF阶段可用如下公式概括:
IR<-Mem[PC]
PC <-PC+4
其中,PC(program counter)表示程序计数器(或下一条指令的地址);IR(instruction register)表示存储待执行的指令。在此阶段,CPU根据PC值获取指令,同时PC会自动指向下一条指令(假设每条指令占4字节)。
2.ID
ID阶段可用如下公式概括:
A<-Regs[IR[10:6]]
B<-Regs[IR[15:11]]
Imm<-IR[15:0]
其中,A和B为操作数;Imm为立即数;Regs为寄存器文件。
在这一级,CPU使用IR[10:6]和IR[15:11]作为寄存器索引从寄存器文件 中读取操作数,或从IR[15:0]中提取立即数。
3.EX
EX阶段可用如下公式概括:
ALU输出<-A+Imm(计算内存操作的有效内存地址)
ALU输出<-A op B(寄存器间操作)
ALU输出<-A op Imm(寄存器与立即数间操作)
ALU输出<-PC+Imm(计算分支指令的目标地址)
其中,op是指令定义的某种运算操作。
在此阶段,ALU可用于计算内存操作的有效地址、执行寄存器间或寄存器 与立即数之间的运算操作,或计算分支指令的目标地址。分支条件的判定也在 此阶段完成。
4.MEM
MEM阶段可用如下公式概括:
LMD<-MEM[ALU输出](内存加载)
MEM[ALU输出]<-B(内存存储操作)if(条件满足)PC<-ALU输出else PC<-PC+4
其中,LMD是流水线寄存器,用于暂存从内存加载的数据。
在此阶段将执行内存加载/存储操作。分支操作*终也在此周期内完成。若EX阶段判定的分支条件成立,则将PC更新为EX阶段ALU输出的目标地址,实现程序的跳转;否则程序继续顺序执行,PC自动指向下一条指令(PC+4)。
5.WB
WB阶段可通过如下公式概括:
Regs[IR[20:16]]<-ALU输出(寄存器间操作)
Regs[IR[15:11]]<-ALU输出(寄存器与立即数间操作)Regs[IR[15:11]]<-LMD(内存加载)
在此阶段,*终结果写回寄存器文件。对于寄存器间操作,将ALU运算 结果写人IR[20:16]指定的目标寄存器;对于寄存器与立即数间操作,将ALU
运算结果写人IR[15:11]指定的目标寄存器;对于内存加载,将从内存读取的 数据(LMD)写人IR[15:11]指定的目标寄存器。
结论:MIPS五级流水线是硬件工程师面试的**知识。面试官通常期望 应聘者能够透彻理解流水线每个阶段的具体功能。
【问题2】流水线冒险及解决方案——基于MIPS五级流水线的案例 分析
答CPU流水线技术虽然能提升吞吐量并实现更高的时钟频率,但并非没 有代价。当多条指令并行执行时,CPU设计者必须解决以下三类冒险:
?结构冒险(structural hazards)。
?数据冒险(data hazards)。
?控制冒险(control hazards)。
本节将详细讨论这些冒险,并结合MIPS五级流水线进行案例研究[1 ]。
1.结构冒险
结构冒险源于硬件资源竞争一当多条指令试图同时访问同一组硬件资源 时就会导致冲突问题的产生。这些资源包括寄存器文件和内存资源。
同一时钟周期内,ID阶段指令需要读取寄存器文件,而WB阶段指令需 要写人寄存器文件。若寄存器文件只有一个端口,则会发生结构冒险。面对这 样的问题,可以将时钟周期划分为前半周期(读操作)和后半周期(写操作)来解决,而更优的方案是为寄存器文件配置*立的读写访问端口。
同一时钟周期内,IF阶段需要从内存读取指令,而同时MEM阶段需要加 载/存储数据,若指令和数据共享同一存储器,则会发生冲突。面对这样的问题,可以采用分离的指令存储器和数据存储器来解决。在现代的计算机体系结构中,这几乎是默认的设计方案一CPU中通常配置*立的L1指令缓存和L1数据缓存。
2.数据冒险
数据冒险发生在试图访问尚未有可用数据时。数据冒险共有三种类型:
?写后读(RAW)。
?读后写(WAR)。
?写后写(WAW)。
在这三种数据冒险中,只有RAW表示真正的数据依赖关系,其余两种仅为名称依赖。在MIPS五级流水线中,WB阶段始终位于ID阶段之后,因此 WAR和WAW在此情况下不会发生




















