注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
青叶漂零的个人空间 https://home.eeworld.com.cn/space-uid-87918.html [收藏] [复制] [分享] [RSS]
日志

Verilog HDL 语法

已有 3366 次阅读2009-7-30 10:54 |

 
 
 

1、always
    always块中被赋值的只能是寄存器类型的变量,如reg、integer、real、time、realtime。每个always在仿真一开始就开始执行,在仿真的过程中不断的执行。

2、assign---连续赋值声明语句
    每当表达式中Net(即连线)或寄存器类型变量的值发生变化时,使用连续赋值声明语句就可在一个或更多电路连接中创建事件。
    规则:
    连续赋值并不等同于进程连续赋值语句,虽然它们相似。确保把assign放在正确的地方。连续赋值语句必须放在任何initial和always块外;进程连续赋值语句可以放在该语句被允许放的位置执行(在initial、always、task、function等块内部)
    可综合性问题:
    综合工具不能处理连续赋值语句中的延迟和强度,在综合中被忽略,用综合工具指定的定时约束来代替。
    连续赋值语句将被综合成组合逻辑电路。
    提示:
    用连续赋值语句去描述那些用简介的表达式就能够很容易表达的组合逻辑。函数能够用来构建表示式。在描述较复杂的组合逻辑电路方面,用always块比用许多语句分开的 连续赋值语句更好,而且仿真的速度更快一些。当Verilog需要电路连线时,可用连续赋值语句把寄存器的值传送到电路连线上(即NET上),例如把一个initial块中产生的测试激励信号加到一个实例模块的输入输出端口。

4、case语句
    规则:
    不确定值X和高阻值Z在caseX声明语句中,以及Z在caseZ声明语句的表达式匹配中都以为着不必考虑。
    在case语句中最多只允许一个default项
    如果某标号用逗号隔开两个或来两个以上的表达式时,只要其中任何一个表达式与case表达式的值相等,就可执行该标号的操作。
    可综合性问题:
    case语句中的赋值语句通常被综合成多路器。如果变量(如寄存器或NET类型)被用作case语句的标号,它就会被综合成优先编码器。
     在一个无时钟触发的always块中,如有不完整赋值(即对某些输入信号的变化其输出扔保持不变,未能及时赋值),它将被综合成透明锁存器。
    在一个有时钟触发的always块中,如有不完整赋值,它将被综合成循环移位寄存器。
    提示:
    为使仿真能顺利进行常常用default作为case声明的最后一个分支,以控制无法与标号匹配的case变量。
    通常情况下使用caseZ比caseX好一些,因为X的存在可能会导师仿真出现令人误解和混乱的结果。
    在caseX和caseZ中声明的标号用?代替Z比较好,因为它是一个无关项而不是一个高阻项。

13、for
    规则:
    当for循环开始执行时,循环计数变量已赋于初始值。在每次循环执行之前(包括第一次),都必须先检查表达式的值;如果它为假(即0,X,Z),则立刻退出循环。而在每一次循环重复执行之后,都要对迭代次数寄存器重新赋值。
    注意:
    reg[2:0] i;              //i永远介于0和7之间
.............................
    for(i=0;i<8;i=i+1)   //循环永远不会停止
.....................................
    for(i=-4;-<0;i=i+1)//循环永远不可能执行。
在以上这些情况中,应将循环变量i定义为整型。
    可综合性问题:
    如果循环的边界是固定的,那么综合是该循环语句被认为是重复的硬件结构。例:
    V=0;
    for(I=0;I<4;I=I+1)
        begin
             F[I]=A[I]&B[3-I];        //四个独立的与门
             V=V^A[I];               //四个级连的异或门
        end

16、fork语句不可综合

19、GATE门
    存在强度问题

21、条件语句声明
    说明:类似于case。如果对某些条件语句进行测试,在这种情况下要使用if-else语句。如果所有的条件优先权一致,则应选用语句。

22、initial
    不可综合

23、实例引用(instantiation)
    实例(instance)是模块,是UDP或门的唯一复制。通过实例的引用可以生成设计的各个层次。层次的行为也能通过UDP、门和其他的模块的实例,并用电路连线(NET)将他们连接起来,从结构上加以描述。
    规则:
     命名的端口连线只能用于模块实例
    如果给出端口的连线顺序列表,则在引用实例时其端口顺序是无关紧要的,但其端口的名字必须与端口模块的名字一致。
    如果给出端口的连线顺序列表,则在引用实例时,其端口列表中如果有两个相邻的逗号,则会因为没有表达式而导致相应端口未连线。如果给出命名的端口连线列表时,在引用实例时,其端口列表中若没有某端口的名字或虽有端口的名字但在括号内没有表达式,也会导致该端口未连线。
     任何表达式都可用来与输入端口相连,但输出端口只能与NET(线路)、一位或多位的连线或这些位的拼接线相连。输入表达式生成隐含的连续赋值。
    如果在实例引用定义时给出了范围,其含义是定义了一个含有同种的多个子实例的实例模块。如果端口表达式的位长与定义的实例模块相应端口位长(即多个同种UDP或门端口位数的总和)一致时,每个表达式都将与每个子实例的端口相连。如果位长不一致、太多或太少,都会出错误。
    #符号有两种不同的用途。它即可以用来强制修正实例模块的一个或多个参量,也可以用于为UDP或门实例指定延迟。对于实例模块,“#”符号后的第一个表达式替代模块中声明的第一个参量,第二个表达式替代模块中的声明的第二个参量,依次类推。
    实例引用pullup、pulldown、tran和rtran这些类型的门时不允许有延迟。
    对于nmos、pmos、cmos、rnmos、rpmos、rcmos、tran、rtran、tranif0、tranif1、rtranif0、rtranif1类型的开关不能定义强度。
    注意:
    端口顺序。UDP和开关实例的引用一般是不能综合的。

24、module模块定义
    可综合性问题:
    每一个模块都被综合为一个独立的分层块,虽然有些工具的默认配置规定把层次展平(为单层),但仍允许用户对综合后生成的网表层次进行控制。
    不是所有工具都支持宏模块的综合。

27、NET线路连接
   NET是结构中为线路连接(连线和总线)建立的模型。net的值是有net的驱动器所决定的。驱动器可以是门、UDP、实例模块或者连续赋值语句的输出。
    规则:
    ......................................
    提示:
    .......................................
    只能用supply0和supply1来声明地和电源。

28、Number数
    数指整数或者实数。在Verilog中整数是通过若干位来表示的,其中某些位可以是不定值X或者高组态Z。
    规则:
    表示字母、十六进制数,Z和X在数的表示中是不区分大小写的,字符Z和?在数的表示中是等价的
    数不能有空格
    负数表示其二进制的补数
    数字的第一个字符不允许出现下划线“_”,但标识符可以。为了提高数字的可读性,可以使用下划线把数字分段,但处理数字时下划线将被忽略。
    位宽指明了数的准确位数
    不明位宽的数字它的位宽为32位或32位以上,这取决于主机字长。
    如果位宽大于实际的二进制数时,高位补0,但若左边最高位是X或Z,在这种情况下,则补X或Z。
    位宽小于实际的二进制数位时,超过位宽的高位将被舍去。
    可综合性问题:
    0、1直接被综合成接地和接电源的连线,赋值X被认为是无关项。
    除了在CASEX和CASEZ语句中的Z被认为是无关项外,在其他情况下Z则被用来表示三态驱动器。
    提示:
    在case语句中通常用?要比Z好。在程序的其他地方不要使用?号,否则会产生混淆。

29、Operators运算符
    可综合性问题:
    逻辑运算符、逐位运算符、移位运算符都是可综合的,都被综合成逻辑运算。
    条件运算符是可综合的,被综合成多路器或带使能端的三态门
    只有常量的/和%是可综合的但结果只能用二进制表示。其他运算符均不能被任何工具所综合。
    ShiftReg <= {ShiftReg[Nbits-2:0],In}
    assign Out = ShiftReg[Nbits-1];//以上是移位寄存器

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章