文章目录一、试卷结构二、单选题共10题每题3分共30分三、简答题共6题每题5分共30分四、编程题共2题每题20分共40分一、试卷结构项目说明笔试岗位数字IC设计工程师题型分布单选题10题每题3分共30分 简答题6题每题5分共30分 编程题2题每题20分共40分总分100分考试时长90分钟二、单选题共10题每题3分共30分1.状态机的编码风格包括一段式、两段式和三段式下列描述正确的是 A. 一段式寄存器输出易产生毛刺不利于时序约束B. 二段式组合逻辑输出不产生毛刺有利于时序约束C. 三段式寄存器输出不产生毛刺有利于时序约束D. 所有描述风格都是寄存器输出易产生毛刺有利于时序约束答案C解析三段式状态机将状态寄存器、次态逻辑和输出逻辑分离输出采用寄存器打拍可有效消除组合逻辑输出的毛刺且利于时序约束。一段式将所有逻辑混在一起易产生毛刺二段式通常为组合逻辑输出仍存在毛刺风险。2.线网中的值被解释为无符号数。在连续赋值语句中assign addr[3:0] -3;addr被赋予的值是 A. 4’b1101B. 4’b0011C. 4’bxx11D. 4’bzz11答案A解析在Verilog中负数以补码形式表示。-3的二进制补码计算3的二进制为0011取反得1100加1得1101。因此-3对应的4bit补码为4’b1101。3.a 4b11001; b 4bx110;选出正确的运算结果 A. a b 0B. a b 1C. b a xD. b a x答案B解析注意a为5bit11001b为4bitx110存在位宽不匹配。a b是逻辑与只要两个操作数都非零即为1。a11001非零bx110虽含x但非全0逻辑值视为1因此a b 1。是按位与结果含x不一定为0或全x。4.下列描述代码可综合的是 A.fork...joinB.assign/deassignC.if...else和caseD.repeat和forever答案C解析if...else和case是基本的可综合条件语句。fork...join、assign/deassign过程连续赋值、repeat和forever通常不可综合或仅用于仿真。5.reg [255:0] mem [7:0];正确的赋值是 A.mem[5] 3d0;B.mem[10] 8d1;C.mem 0;D.mem[5][3:0] 4d1;答案D解析mem是一个深度为8、位宽为256的存储器数组。A使用是比较而非赋值B索引mem[10]超出深度范围0~7C不能对数组整体赋值D正确对第5个元素的低4bit进行部分赋值。6.以下关于逻辑综合中解决congestion问题描述不正确的是 A. 禁用多引脚标准单元例如4输入引脚以上的标准单元B. 使用partial blockage以降低congestion区域的cell densityC. 过多使用MUX单元不利于congestion的优化因此MUX单元要尽可能禁用D. 尽可能使用DCG做逻辑综合答案C解析MUX单元是常用逻辑单元不能“尽可能禁用”只能根据拥塞情况适当控制使用比例。A、B、D均为合理的拥塞优化策略禁用多引脚单元可减少局部绕线密度partial blockage降低单元密度DCGDesign Compiler Graphical具有物理感知能力可优化congestion。7.综合不包括下面哪一个过程 A. TranslationB. RoutingC. MappingD. Logic Optimization答案B解析综合Synthesis包含翻译Translation、逻辑优化Logic Optimization和映射Mapping。布线Routing属于物理设计阶段不在综合流程内。8.下面关于FIFO的描述正确的是 A. FIFO的读写必须属于同一时钟域B. FIFO是先进先出的存储器C. 外部不可以直接操作FIFO的读写地址D. FIFO的空信号在写时钟域产生满信号在读时钟域产生答案B解析FIFO的基本特性是先进先出First In First Out。A错误FIFO分为同步FIFO和异步FIFOC错误外部通过读写指针间接操作地址D错误异步FIFO的空信号在读时钟域产生满信号在写时钟域产生。9.Verilog语言中下列哪些语句不可以被综合 A.generate语句块B.for语句块C.function语句块D.force语句答案D解析force和release是仿真用的过程连续赋值语句不可综合。generate、可综合风格的for常量循环、function均可综合。10.下面表达式中结果位1’b1的是 A.4b1010 4b1101B.!4b1001 || !4b0000C.4b1101D.~4b1100答案B解析逐项分析A按位与得4’b1000非单bit 1B中!4b1001为0!4b0000为1逻辑或得1C为缩减与4’b1101相与得0D为按位取反得4’b0011非单bit 1。三、简答题共6题每题5分共30分11.5分简述流水线设计的方法和作用。答案方法将组合逻辑路径分割为多个较短的阶段每个阶段之间插入寄存器流水线寄存器。数据在每个时钟周期前进一级多组数据可同时在不同阶段处理。作用提升系统吞吐率缩短关键路径提高时钟频率提高资源利用率各阶段并行工作代价增加延迟Latency和面积寄存器开销12.5分怎样用D触发器、与门、或门、非门组成二分频电路请画出电路图。答案工作原理D触发器的Q非端或Q端经反相器连接至D输入端。每个时钟上升沿输出Q翻转一次实现二分频。13.5分请根据下面的设计描述尽可能多地列出你所能想到的用于功能验证的测试点。一个异步FIFOrdata和wdata均为8位数据FIFO深度为16。当rst_n输入为低时FIFO被复位。当wclk的上升沿采样到wr为高时数据被写入FIFO当rclk的上升沿采样到rd为高时FIFO输出数据。此外当FIFO为空时empty信号输出为高当FIFO满时full信号输出为高。答案测试点清单复位测试复位后FIFO内数据清空empty1full0读数据无效。单次写入读出写1个数据后读出验证数据正确性。满标志测试连续写入16个数据验证full信号在第16个写操作后拉高且继续写入数据不被覆盖。空标志测试写满后连续读出16个数据验证empty信号在第16个读操作后拉高且继续读出数据无效或保持。写满后读空写满→读空循环验证指针正确回绕。并发读写测试读写时钟异步同时进行读写操作验证数据不乱序、不丢失。背靠背读写连续快速读写验证无亚稳态导致的功能错误。格雷码指针同步验证检查读写指针跨时钟域同步是否正确。几乎满/几乎空测试若设计包含almost_full/almost_empty标志需测试阈值。边界条件测试写时钟远快于读时钟快写慢读导致满读时钟远快于写时钟快读慢写导致空。错误注入在满时写入、空时读出验证FIFO行为符合规格通常忽略写或读出无效数据。随机读写测试随机化读写间隔和有效信号配合Scoreboard比对数据。14.5分用D触发器搭建4进制计数器。答案说明两个D触发器级联DFF0的D端接~Q0通过反相器每个时钟翻转实现二分频Q0为CLK/2。DFF1的D端接Q0 ⊕ Q1在Q0的上升沿翻转。最终Q1Q0输出00→01→10→11→00实现4进制计数。15.5分设计一个同步FIFO读写时钟相同。其中写入时每100个时钟周期会写10个具体哪个时刻写入不确定读出侧每10个cycle会读1个。计算FIFO的最小深度。答案分析写侧平均速率10/100 0.1 word/cycle读侧平均速率1/10 0.1 word/cycle平均速率相等因此平均意义上FIFO不会无限累积。最坏情况分析写入的10个数据可能在100周期内连续出现背靠背写入此时写突发长度为10。读侧每10周期读1个即读取速率固定为0.1 word/cycle。在连续10个写周期内FIFO中累积的数据量为写入10个 - 读出10×0.1 10 - 1 9个。因此在最坏情况下FIFO需要能够容纳9个数据。考虑写读使能的不确定性可能上一轮的残留数据与新突发叠加但最坏情况仍由突发长度和速率差决定。答案最小深度为9。通常再增加1~2作为余量取10或11。题目问最小深度答案为9。16.5分如下代码在综合时是否可以综合出时钟门控电路如果能画出时钟门控示意图如果不能请修改使信号out可以综合出时钟门控电路。always (posedge clk or negedge rst_n) begin if(rst_n 1b0) out 64b0; else if (out_en) out data; else out 64b0; end答案不能综合出时钟门控电路。原因在else分支中out被赋值为64b0这意味着当out_en为0时寄存器被强制清零而非保持原值。时钟门控的前提是寄存器在使能无效时保持当前值即out out。修改后代码可综合出时钟门控always (posedge clk or negedge rst_n) begin if(rst_n 1b0) out 64b0; else if (out_en) out data; // 移除 else 分支out 保持原值 end时钟门控示意图说明综合工具将out_en信号作为时钟门控使能out_en为0时关闭寄存器时钟寄存器保持原值从而节省动态功耗。四、编程题共2题每题20分共40分17.20分用Verilog语言实现一个带使能的模100异步清零计数器模块定义为module count(out, count_en, clr, clk);答案module count ( output reg [6:0] out, // 0~99需要7bit (2^7128) input wire count_en, input wire clr, // 异步清零高有效 input wire clk ); always (posedge clk or posedge clr) begin if (clr) begin out 7d0; // 异步清零 end else if (count_en) begin if (out 7d99) out 7d0; // 计到99回0 else out out 1b1; end end endmodule设计要点clr为异步复位信号高有效在敏感列表中使用posedge clr实现异步清零。模100计数0~99循环达到99后下一个使能周期归零。输出位宽ceil(log₂100)7bit。count_en为高时计数使能为低时保持。18.20分画出可以检测“11101”序列的状态转移图并用Verilog实现FSM。要求每检测到一次该序列输出2个周期的高电平信号要求使用低功耗的状态机编码方式。答案1状态转移图状态说明IDLE初始状态未检测到任何有效序列。S1检测到1。S11检测到11。S111检测到111。S1110检测到1110。DET1检测到11101输出高电平第1拍。DET2输出高电平第2拍结束后根据当前输入跳转实现重叠检测。重叠检测说明序列“11101”的后缀“1”可与后续“1101”组成新序列。在DET2状态若输入为1则相当于已匹配到“1”跳转至S111因DET2前状态为DET1而DET1由S11101得来此时输入1意味着已有连续三个1需根据具体设计调整重叠逻辑。实际上在输出两拍期间继续采样DET2后的下一状态由输入决定若输入1相当于新序列已有一个“1”但考虑到前面序列末尾的“1”可能已匹配到更长的前缀。具体实现时在DET2状态根据输入决定回到哪个状态保证不丢失重叠序列。2Verilog实现低功耗状态机编码module seq_detector_11101 ( input wire clk, input wire rst_n, input wire din, output reg out ); // 状态编码采用格雷码低功耗状态跳转时只有1bit翻转 localparam IDLE 4b0000; // 0 localparam S1 4b0001; // 1 localparam S11 4b0011; // 3 localparam S111 4b0010; // 2 localparam S1110 4b0110; // 6 localparam DET1 4b0111; // 7 localparam DET2 4b0101; // 5 reg [3:0] curr_state, next_state; // 状态寄存器 always (posedge clk or negedge rst_n) begin if (!rst_n) curr_state IDLE; else curr_state next_state; end // 次态逻辑三段式状态机 always (*) begin next_state IDLE; case (curr_state) IDLE: next_state din ? S1 : IDLE; S1: next_state din ? S11 : IDLE; S11: next_state din ? S111 : IDLE; S111: next_state din ? S111 : S1110; S1110: next_state din ? DET1 : IDLE; DET1: next_state DET2; // 无条件进入第二拍输出 DET2: begin // 重叠处理DET2后根据当前输入跳转 if (din) next_state S111; // 输入1相当于已匹配到111 else next_state S1; // 输入0相当于已匹配到1 end default: next_state IDLE; endcase end // 输出逻辑Moore型仅由状态决定 always (posedge clk or negedge rst_n) begin if (!rst_n) out 1b0; else out (curr_state DET1) || (curr_state DET2); end endmodule设计要点低功耗编码使用格雷码编码状态相邻状态间仅1bit翻转减少组合逻辑和状态寄存器翻转功耗。三段式状态机状态寄存器、次态组合逻辑、输出逻辑分离利于时序收敛和毛刺消除。重叠检测在DET2状态根据输入din跳转到合适状态保证连续序列如“111011101”可被连续检测。输出2周期高电平设置DET1和DET2两个状态两个状态下out均为1实现两拍输出。