不枉初心,砥砺前行

皮皮祥的博客

欢迎留言,评论

导航

Verilog 基本语句

  Verilog HDL语句包括过程语句、块语句、赋值语句、条件语句、循环语句、编译导向语句等。

类别 语句
赋值语句 持续赋值语句:assign
过程赋值:=,<=
块语句 串行块:begun-end
并行块:fork-join
过程语句 initial
always
条件语句 if-else
case,casez,casex
循环语句 for
repeat
while
forever

1.连续语句赋值:

  用于对线网进行赋值,等价于门级描述。具有以下特点:

    1. 左值必须为一个线网类型的变量或向量,不能是寄存器类型。
    2. 输出值随输入值变化而随时变化。
    3. 操作数可以是线网或寄存器或函数调用。
    4. 必须用“=”阻塞赋值进行赋值。

  格式:    

    1. 普通连续赋值:wire OUT;assign OUT=INT1 & INT2;
    2. 缺省连续赋值(在线网声明的同时对其赋值): wire OUT=INT1 & INT2;
    3. 缺省线网声明:信号名被用在连续赋值左侧,则该信号默认为一个缺省声明的线网类型变量:wire INT1;assign OUT=INT1 ;//则OUT默认为线网类型;
      •   线网被连接在模块端口,则缺省线网宽度为模块端口的宽度。     

2.单元块语句

①顺序块begin-end:

格式:

  begin:块名     //块名可缺省

    语句1;

    语句2;

      ....

    语句N;

  end

②并行块fork-join:

格式:

  fork:块名     //块名可缺省

    语句1;

    语句2;

      ....

    语句N;

  join

  注意:如果两条语句在同一时刻对同一变量产生影响,则可能出现隐含的竞争。

3.条件语句

①if-else语句

  1)系统对逻辑表达式的值进行判断,若为0,x,z,按“假”处理;若为1,按“真”处理;

  2)if和else语句中可嵌套多个操作语句;

  3)if-else语句具有优先级,前面的优先级最高。

②case语句

 1)case语句

  case(表达式)

  数值1:

    语句1;

  ....

  数值n:

    语句n;

  default:

    语句n+1;

  endcase

  case语句没有优先级,即case语句的每个分支都是并行的,与位置无关。

  case语句的所有表达式的值的位宽必须相等。

 2)casez与casex语句

  

        

  

 

 使用条件语句时,为了使程序具有更好的可读性和可维护性,应遵循以下几点要求:

①if-else语句的级联不要超过3层。

②case的级联不要超过2层。

③if语句必须要有else,case语句必须要有default,否则将产生不必要的锁存器;设计中禁用casez/casex。不能使用casez/casex语句,不是说他们没用,当在仿真实验中,这些是可用的。

4.循环语句

  四种循环语句:forever、repeat、while、for

1)forever语句

  forever语句 是连续的执行语句,格式如下:

    forever

    语句;

  或

    forever

    begin

    多条语句;

    end

  forever语句常用于产生周期性的波形,作为仿真控制信号。forever语句不能独立写在程序中,必须写在initial中。

  forever用来表示永久循环,在永久循环中不包含任何条件表达式,等价于永远为真的while循环,如while(1)。如果要从forever循环中退出,可以使用disable语句。

2)repeat语句

  repeat语句可以连续执行一条语句n次,主要特点是可以执行固定次数的循环,其使用格式如下所示:

    repeat(循环次数表达式)

      语句;

  或

    repeat(循环次数表达式)

    begin

      多条语句;

    end

3)while语句

  使用格式:

    while(循环执行条件表达式)

      语句;

  或

    while(循环条件表达式)

    begin

      多条语句;

    end

 4)for语句

  使用格式:

    for(表示式1;表达式2;表达式3)

5.过程语句

  过程语句有两种:initial和always

  initial语句常用于仿真中的初始化,initial过程块中的语句仅执行一次;always语句则是不断重复执行的。

  每一条initial语句和always语句都是独立的执行过程,彼此并行执行,执行顺序于在模块内的书写顺序无关,并且,每条initial和always语句过程语句都是在仿真时间0时刻同时开始的。

  initial语句和always语句不可嵌套使用

1)always语句

  格式如下:

    always @(敏感信号表达式)

    begin

      语句1;

      .....

      语句n;

    end

  敏感信号表达式中应列出影响块内取值的所有信号,多个敏感信号用关键字“or”连接。

  敏感信号可以分为两种类型:电平敏感型、边沿敏感型。边沿敏感主要用来描述组合逻辑电路,而边沿敏感主要用来描述时序逻辑电路。

  每一个always过程最好只有一个类型的敏感信号触发。

    always@(A or B)或always@(posedge CLK or negedge RST_B)//表示时钟的上升沿或者复位的下降沿。

  对于电平敏感型,可用“*”代替所有的输入或条件信号,如:

2)initial语句

  只执行一次,不带触发条件,常用于仿真中的初始化,是面向模拟仿真中的语句,不被逻辑综合工具支持。

    initial 

      语句1;

      .......

      语句n;

    end

 

posted on 2022-10-05 23:12  皮皮祥  阅读(364)  评论(0编辑  收藏  举报