Verilog HDL 语法整理 (三)


目录

前言

一、Verilog 并行语句

1、连续赋值语句

        1.1直接连续赋值语句

        1.2条件连续赋值语句

2、Verilog 程序块语句

        2.1 initial 块

        2.2 always 块

3、Verilog 实例化语句

        3.1 单独实例化

        3.2 数组实例化

4、Verilog 生成语句

        4.1 循环生成

        4.2 条件生成

5、Verilog 函数调用语句

二、Verilog 串行语句

1、Verilog 阻塞赋值语句

2、Verilog 非阻塞赋值语句

3、Verilog 条件语句

        3.1 if 条件语句

        3.2 case 条件语句

4、Verilog 循环语句

5、Verilog 等待语句

6、Verilog 任务调用语句

三、Verilog 编译指令

1、define

2、timescale

3、include 

四、关键字

参考声明




前言

        本文承接前文:Verilog HDL 语法整理(二),继续整理 Verilog HDL语法。本文主要介绍 赋值语句、生成语句、条件语句、循环语句、块语句等。


一、Verilog 并行语句

1、连续赋值语句

        1.1直接连续赋值语句

        语法:

assign     <线网型 变量名> =     <表达式>;

        1.2条件连续赋值语句

        语法:

assign     <线网型 变量名> =     <表达式>  ? <表达式为真> : <表达式为假>;

2、Verilog 程序块语句

        2.1 initial 块

        语法:

initial
    begin
        <代码块>;
    end

        2.2 always 块

        语法:

always @ (<敏感列表>)
    begin:<标签>
        <代码块>;
    end

        语法中,标签 可以省略,注意 标签必须紧跟在 begin 后面。敏感列表 一般有三种实现:纯组合逻辑、纯同步时序逻辑、具有异步复位的同步时序逻辑。敏感列表中,不止一个时,用英文“,”隔开,或者用 “or” 。

1、边沿事件

上升沿:posedge <变量名>,

下降沿:negedge <变量名>,

2、纯组合逻辑

        纯组合逻辑,建议在 always 块中只使用 阻塞赋值。敏感列表 是电平敏感。对一切都敏感,可以用通配符 “ * ”。例:

always @ (a,b,c)
    begin
        d= a & b & c ;
    end

3、纯时序逻辑

        纯时序逻辑,建议在 always 块中只使用 非阻塞赋值。敏感列表 是边沿敏感。例:

always @ (posedge I_CLK)
    begin
        A <= B;
    end

具有同步复位的时序逻辑:

always @ (posedge I_CLK)
    begin
        if (I_Rst_n == 1'b0) // 同步 低电平复位
            begin
                I_DATA <= 8'b0;
            end
        else
            begin
                I_DATA <= A;
            end
    end

具有异步复位的时序逻辑

always @ (posedge I_CLK or negedge I_Rst_n)
    begin
        if (I_Rst_n == 1'b0) // 异步 低电平复位
            begin
                I_DATA <= 8'b0;
            end
        else
            begin
                I_DATA <= A;
            end
    end

3、Verilog 实例化语句

        3.1 单独实例化

        此方式适用于,仅对模块实例化一次,或者很少次数(3次以下)。

	ASYNC_FIFO_ENCAP inst_ASYNC_FIFO_ENCAP
		(
			.I_Rst_n  (I_Rst_n),
			.I_WR_CLK (I_WR_CLK),
			.I_RD_CLK (I_RD_CLK),
			.I_DATA   (I_DATA),
			.I_VAL    (I_VAL),
 
			.O_DATA   (O_DATA),
			.O_VAL    (O_VAL),
			.O_FULL	  (O_FULL)
		);

        3.2 数组实例化

        当某个模块需要对底层的 某一模块进行 几十次 甚至 几百次 的例化,不建议再使用单独例化,这样代码量会剧增,代码可读性变差。强烈推荐 数组实例化。或者使用 generate for 语句(应用更灵活、方便,后在后文介绍)。

4、Verilog 生成语句

        在模块中大量 类似数据处理、模块例化时很有用。

        4.1 循环生成

基本语法:

genvar    <生成变量名> ;

generate
    for (<生成变量名> = <变量初值> ; <生成变量名>  <大小关系比较符>  <变量终值> ;<生成变量名> = <生成变量名> + 1 )
        begin:<标签>
            <代码>;
        end
endgenerate

【注】:

1、for 语句中使用的 循环变量 必须用 genvar 定义;在 for 循环之前定义即可,一般在 generate 块外面定义。

2、循环段的 标签 必须有。

3、for 语句的内容不管多少(哪怕只有一条),必须有 begin-end;

4、循环段可以是实例化语句,也可以是连续赋值语句。

5、该语句支持嵌套。

示例:

input [7:0] I_A [63:0] ;
input [7:0] I_B [63:0] ;
input       I_VALID    ;

output [15:0] O_RES [63:0] ;

genvar i;

generate
    for (i=0 ;i<64 ;i=i+1)
        begin:ADDER
            EXAMPLE_MODULE INST_EXAMPLE_MODULE(
                .I_A(I_A[i]),
                .I_B(I_B[i]),
                .I_VALID(I_VALID),
                .O_RES(O_RES[i])
                );
        end
endgenerate

        4.2 条件生成

generate - if 语句:

generate
    if (<条件语句>)
        begin:<标签1>
            <代码>;
        end
    else if (<条件语句>)
        begin:<标签2>
            <代码>;
        end
    else (<条件语句>)
        begin:<标签3>
            <代码>;
        end
endgenerate

【注】

1、条件表达式必须为 常量比较。

2、begin - end 只有在多行语句代码是才是必须的

3、每个条件的分支名称不是必须的。

generate - case 语句:

generate
    case (<常量表达式>)
        <可匹配的数值>:
                    begin:<标签1>
                        <代码>;
                    end
        <可匹配的数值>:
                    begin:<标签2>
                        <代码>;
                    end
            … … … …

        default:
                    begin:<标签n>
                        <代码>;
                    end
    endcase    
endgenerate

【注】:

1、条件表达式必须为 常量比较。

2、begin - end 只有在多行语句代码是才是必须的

3、每个条件的分支名称不是必须的。

5、Verilog 函数调用语句

function [:] <输出端口> ;
    input <输入端口名称> ;
    <其他输入端口> ;

    <变量声明> ;

    begin
        <代码段> ;
    end
endfunction

【说明】:

1、<输出端口> , 指的既是输出端口名称,也是函数调用名其位宽由 [:] 决定。

2、<变量声明中> ,只能声明寄存器类型的变量。

3、函数体中语句只能用阻塞赋值。

4、函数调用时只能用位置赋值,不能用映射赋值。

5、函数调用可在 并/串 行语句中使用。

6、函数可以调用别的函数。

7、函数支持递归调用。(一般仅用于 仿真)

8、函数不能调用任务。

二、Verilog 串行语句

1、Verilog 阻塞赋值语句

        阻塞赋值语句,最终的功能实现与语句的顺序有关。(关于具体细节前面几篇都有介绍,此处不再赘述)

2、Verilog 非阻塞赋值语句

        阻塞赋值语句,最终的功能实现与语句的顺序无关。(关于具体细节前面几篇都有介绍,此处不再赘述)

3、Verilog 条件语句

        3.1 if 条件语句

                语句中 else if 和 else 分支都不是必须的。(关于具体细节前面几篇都有介绍,此处不再赘述)

        3.2 case 条件语句

                不管有无覆盖全部可能的情况,都要加上 default 分支。(关于具体细节前面几篇都有介绍,此处不再赘述)

4、Verilog 循环语句

        for 、while 、repeat 、forever 等循环语句更多是用于仿真,此部分会在后续的文章中专门整理。

5、Verilog 等待语句

        等待语句用于仿真,此部分会在后续的文章中专门整理。

6、Verilog 任务调用语句

task <任务名> ;
    input <输入端口名称> ;
    <其他输入端口> ;

    output <输出端口名称> ;
    <其他输出端口> ;

    <变量声明> ;

    begin
        <代码段> ;
    end
endtask

【说明】:

1、任务有输入输出端口,数据通过输入端口 进入任务,从输出端口输出结果,任务可以有多输出。

2、<变量声明中> ,只能声明寄存器类型的变量。

3、任务中语句可用阻塞赋值(组合逻辑)亦可用非阻塞赋值(时序逻辑)。

4、任务调用时只能用位置赋值,不能用映射赋值。

5、任务调用只可在 串 行语句中使用。

6、任务可以调用别的任务。

7、任务支持递归调用。(一般仅用于 仿真)

8、任务能调用函数。

任务 基本都在 仿真时使用,所以后续关于仿真的语法,会再具体说明。

三、Verilog 编译指令

1、define

语法1:

`define <名称> <字符>

示例:

`define DATA_WIDTH 16
wire [`DATA_WIDTH - 1 : 0] I_DATA ;

语法2:

`define <名称>

语法3:

`ifdef <名称>
    <语句> ;
`endif

语法4:

`ifdef <名称1>
    <语句1> ;
`elsif <名称2>
    <语句2> ;

<其他分支>

`else 
    <语句n> ;
`endif

示例:

`define SIM
`ifdef SIM
    DATA_NUM = 2 ;
`else 
    DATA_NUM = 256 ;
`endif

2、timescale

语法:

`timescale <数值1> <单位1> / <数值2> <单位2>

【说明】:此指令在仿真时序分析中使用,标配是:`timescale 1ns/1ps  前面的是时间的计算单位,后面的是时间精度。

3、include 

一般将 Verilog 头文件(.vh 文件)包含进去时 使用。用法:

`include "<头文件名>"

四、关键字

Verilog HDL 语法整理 (三)_第1张图片

  

参考声明

【1】夏宇闻. Verilog 数字系统设计教程 第二版.

【2】狄超. FPGA之道.

【3】IEEE Standard for Verilog Hardware Description Language 1364-2005.



文末推荐

掌握了基本的Verilog语法,不去实战练习的话很难有大的突破。牛客网可以为大家提供一个免费的刷题练习的平台。非常推荐大家使用。

 链接如下:牛客网-Verilog专项https://www.nowcoder.com/link/pc_csdncpt_zls_verilog这个里面有很多代码题目练习,对于新手来说可以快速掌握Verilog编程的基本语法,对于老手来说也可以巩固自己的编程能力。不用付费免费试用哦。基本是每个即将找工作的人必备的刷题网站。快行动起来吧!

你可能感兴趣的:(Verilog,HDL,语法整理,verilog,语法)