Verilog代码新手
这个问题我面试时被问过好几次,也作为面试官考过别人。痛点确实是参数化和避免锁存器。很多人用casez写死位数,不通用。公认比较优雅的写法是用递归思考,但代码上用generate循环或function实现参数化优先级链。
我的经验是,手写时用组合always块,但赋值策略要小心。一种稳健写法是:先给输出赋“全零输入”时的默认值,然后用if-else if链从高到低判断。if-else if链本身隐含优先级,且能综合成优先级选择器。注意每个分支都要完整赋值所有输出(valid和dout),这样就不会产生锁存器。
细节上:输出编码宽度用$clog2(WIDTH)动态计算,这是参数化的关键。valid信号必须要有,用来指示是否有输入为1。所有输入为0时,valid=0,dout值其实无所谓,但最好设成0或其他确定值(避免x传播)。
另外,注意输入是否应该是one-hot?优先编码器输入允许多个1,输出最高优先级的1的位置。如果面试官没明说,要确认清楚。代码写完后,主动提一下测试点:全0、全1、只有LSB为1、只有MSB为1、中间位为1、多个1同时存在等情况。这能体现工程思维。
