欢迎大家关注“数字IC剑指offer”公众号!
1.Verilog为什么适合描述硬件设计?
- always块间是并行的,符合硬件中电路并行计算的特性
- always时钟触发的特性,符合寄存器的行为
- Verilog是一种自顶向下的层次化设计方法,能够将复杂的大型数字系统划分为规模较小且功能相对简单的单元电路,从而加速大型数字系统的设计、调试等工作
- Verilog的行为级描述方法可以简化硬件电路的设计,可借助于高级语言的精巧结构
- Verilog支持开关级、门级、RTL级、算法级、系统级设计
2.阻塞赋值和非阻塞赋值的区别?
- 阻塞赋值的操作符为=,阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上是在前一句赋值语句结束后在开始赋值的,阻塞赋值在语句结束后立即完成赋值操作,可以认为是顺序执行,用于组合逻辑的设计;
- 非阻塞赋值的操作符为<=< span="">,非阻塞赋值的操作可以看作为两个步骤的过程:1)在赋值时刻开始时,计算非阻塞赋值RHS表达式,2)在赋值时刻结束时,更新非阻塞赋值LHS表达式。是一个同时赋值的操作,并行执行,用于时序逻辑的设计
3.为什么用于综合的verilog不建议使用for循环?
- DC无法优化for循环的逻辑,只是单纯进行展开和复制,可能增大电路的面积,降低性能
4.如何防止综合出Latch?
- 在if-else和case中判断所有条件分支
- 在组合逻辑进程中,敏感向量列表要包含所有要读取的信号(包括RHS和判断语句中的信号)(注意:对仿真有影响,但是综合工具会自动补全敏感向量列表,所以在综合之后的电路中是不会有latch的)
- 不要出现自己给自己赋值的情况
- 不要出现组合逻辑环路
5.verilog可综合风格?
- 时序逻辑用非阻塞赋值,组合逻辑用阻塞赋值,同一个always块中既有时序逻辑又有组合逻辑时用非阻塞赋值,不要在同一个always块中混合使用,不要在两个及以上always块中对同一个变量赋值
- 所有内部寄存器都能复位,通过复位使信号初始状态可预测
- 不混合使用上升下降沿(可以考虑使用倍频时钟来设计)
- 不使用initial,不要使用延时,不使用循环次数不确定的循环语句
- 防止出现Latch(除非目的性的Latch)
6.verilog可综合、不可综合语句汇总?
- 所有综合工具都支持的结构
always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter - 所有综合工具都不支持的结构
time,defparam,$finish,fork,join,initial,delays,UDP,wait - 有些工具支持有些工具不支持的结构
casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。 - 注:while在某些情况下是可以综合的,例如while(posedge clk)这和always@(posedge clk)作用一样。
7.function和task区别?
- 可综合的任务和函数都只能实现组合逻辑
8.一段式、两段式、三段式状态机?
- 一段式(要避免):将整个状态机写在一个always块中,将状态转移判断的组合逻辑和状态寄存器转移的时序逻辑混写在一起,既描述状态转移,又描述转移状态的输入和输出。一段式不利于时序约束、功