verilog之不常用语句

Posted on 2022-03-07 23:05  绿叶落秋风  阅读(205)  评论(0编辑  收藏  举报

verilog之不常用语句

前言

verilog是硬件描述语言,其主要特点是针对硬件逻辑的描述;在FPGA上实现时,常用的语句往往和硬件有直接的关联。比如assign,原理图上的连线,如果不省略,应该是最频繁的语句。再如always,寄存器的驱动逻辑,作为时序的主要描述方式,成为verilog最有效的代码。然后是条件语句,完成各种控制结构。其次是计算结构,实现数据的数学转化。前面四个语法,基本占据了verilog的绝大部分的工作。在熟练掌握这四类语法后,如何熟悉应用其他语法以提高效率是需要考虑的。最好的方法就是熟悉不常用的语法,为设计提供备选项。


generate  | endgenerate

verilog中压缩代码的利器,尤其是和for配合使用时,能够起到事半功倍的效果。对于generate,需要注意的是,这个关键字声明了一个可以使用genvar驱动的结构的区域。作为变量,genvar可以驱动各种条件和循环结构。目前支持的if和for是使用较多的。其中generate if和ifdef的功能基本重叠(效率可能低于预编译),使用频率略低。generate for实际上是对某个模块或功能进行重复声明,这在硬件电路中是非常重要的。使用genvar描述模块的变化,如位宽,可以实现动态的位宽调整。这只是最初级的应用。实际上,generate结构中包含always时,条件结构可以嵌入其中,这个时候提供了一个genvar和reg变量交互的空间,可以实现寄存器根据参数实现最大化的合并。

function | endfunction

和C中函数遍地走不同,verilog中函数出现的比例十分低。这里最大的原因是函数内不能包含时序逻辑,也就是函数只能输出组合逻辑所能实现的功能。而受制于FPGA的硬件特性,组合逻辑是不能过于复杂的,否则时序会十分紧张。这就导致verilog的函数无法像C中代码逐条执行一样实现函数的反复调用。不过,函数可以作为内部计算模块,用于实现参数的自动计算。这样就不需要考虑硬件特性,只需要完成参数的计算结果输出即可。也就是说,将verilog的函数用于常量的计算可能是最好的使用方式。尤其是函数内部支持interger形式的计算,可以方便地实现某些固定公式的参数转化。如log2,exp2等函数都可以使用函数在verilog忽略硬件实现参数计算。


task | endtask

task和函数类似,不过内部可以支持时序逻辑,所以使用频率略高。在不使用参数时,task就是一段代码的换个区域书写。task内部使用的左变量和task的应用环境相关。在使用参数时,task可以实现多环境调用。task作为一段特殊的区域,可以实现function所无法实现的功能。一方面,task内部支持for结构,不过需要使用interger作为驱动变量;另一方面,支持always的赋值语句(在always内部调用)。这就提供了一种可能,在always内部使用for循环实现代码的精简。不过,这种精简必须满足硬件特性,因为task在always内部时使用的是时序逻辑。


小结

这里介绍了verilog中使用较少的三种语法。这三种语法有一定的共同处,即都支持与条件结构和循环结构的嵌入。同时也可以嵌入assign和always或者被嵌入。为了方便理解,可以将其理解为区域。generate是genvar的区域。function和task都是interger的区域。三者的区别和共同点有很多,这里只是简单列举了比较突出的点。实际应用中,需要考虑的往往是使用情景。一般在代码精简中,function用于常量计算,generate用于控制结构近似的情况,task用于参数形式近似的情况。