Verilog的一些简单语法

一、变量

    Verilog HDL有线网型和寄存器型两种类型的变量,每种类型都有在电路中的实际意义。

    1.线网型变量:
    它相当于硬件电路中的各种物理连接,其特点是输出的值紧跟随输入值进行变化。

     wire型变量最经常被用到,对于wire型变量有两种赋值方式:(1).直接将变量连接到模块的输出端。(2).第二种方式是使用assign持续赋值语句进行赋值。

    例:

wire[7:0] input_data;
assign input_data[7:4]=4b'0000

    2.寄存器型变量

    寄存器表示一个抽象的数据存储单元,可以通过赋值语句改变寄存器内存储的值。

    寄存器只能在always和initial过程语句中被赋值,而在未被赋值之前,寄存器的缺省值为X。

    always语句的语法结构:always @(sensitive_table)    其中,sensitive_table称作敏感列表,其中包含always内部操作的一个或多个触发条件。

    不同于assign语句只有一行代码,always语句中可以包含多行代码。

    注意:同一个reg变量不能在多个不同的always里赋值,如果进行同时的赋值,就相当于对同一变量进行并行的操作会出现错误。

二、赋值方式

     赋值方式可以简单分为两种:阻塞赋值(=)和非阻塞赋值(<=)。

     阻塞的赋值方式主要在顺序代码块中实现。如果在顺序代码块中使用阻塞赋值语句,如果这一句没有执行完成,则最后面的语句都不会被执行;如果在顺序代码块中使用非阻塞赋值,则执行这一语句的同时,并不会阻碍下一句代码的执行。而且,如果后一个语句涉及到前面一个语句执行前变量的数值。非阻塞赋值是Verilog作为硬件描述语言与普通程序语言的一个重大区别。

    事实上,阻塞在硬件电路中是无法实现的。在经过电路综合后所用的语句都是非阻塞赋值。

    在一般的书写习惯中,assign中使用”=“而always中写”<=“。

三、函数与任务

    在verilog中函数与任务的作用主要是为了减少主模块的代码量。

    1.函数的声明格式:

    例:

function[15:0] circle(input[7:0] diameter);
begin
    circle=(24'd201*{16'h0,diameter}*{16'h0,diameter})/256;
end
endfunction

    函数只有一个输出值,在()中定义的皆为输入变量。   

注意事项:(1).函数定义只能在模块中完成,不能在过程块中。

 (2).函数至少要有一个输入端口;不能包含输出端口和双向端口;

 (3).在函数结构中不能使用时间控制语句(#、wait),不能使用disable中止语句。

 (4).函数的结构体中不能出现过程块语句(always)。

 (5).函数可以调用函数,不能调用任务。

 (6).函数调用可以在任务块或assign中出现。

 (7).函数调用语句不能单独出现,必须为赋值语句的右端操作数。

    !!在Verilog中函数的变量地址为竞态分布,如果想要进行多次调用必须在function关键字后加automatic关键字使得任务成为可重复使用。

   例:

function automatic[15:0] circle(input[7:0] diameter);
begin
    circle=(24'd201*{16'h0,diameter}*{16'h0,diameter})/256;
end
endfunction

  2.任务

    任务的功能要比函数强大

   任务可以有多个输入信号与多个输出信号,甚至可以没有输入和输出。

   

task task_name(ports_list);
begin
     ....
end

   不同于函数的调用,任务的调用是在代码里单独一行进行书写。

  注意:(1).任务的输入输出端口和双向端口的数量不受限制,甚至可以没有输入输出以及双向端口;

  (2).在任务定义的描述语句中,可以使用出现不可综合操作符合语句(使用最为频繁的就是延迟控制语句),但这样会造成该任务不可综合;

  (3).在任务中既可以调用其他任务或函数,也可以调用本身;

  (4).在任务定义结构内不能出现initial和always过程块;

  (5).可以在任务中中断正在执行的任务,但其是不可综合的;当任务被中断后,程序流程将返回到调用任务的地方继续向下执行;

  (6).任务调用语句只能出现在过程块之中;

  (7).任务调用语句和一条普通的行为描述语句的处理方法一致;

  (8).当被调用输入输出或双向端口时,任务调用语句必须包含端口名列表,且信号端口顺序和类型必须和任务定义结构中的顺序和类型一致;需要说明的是,任务的输出端口必须和寄存器类型的数据变量对应;

  (9).综合任务只能实现组合逻辑,也就是说,调用可综合任务的时间为“0”;而在面向仿真的任务中可以带有时序控制,如时延,因此面向仿真的任务的调用时间不为“0”。

 3.函数与任务的共同点与区别(借用参考书的定义)

  

四、生成块

https://blog.csdn.net/daijingxin/article/details/102730596

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daijingxin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值