Verilog HDL可综合与不可综合语法

文章目录

  • 一、可综合的语法子集
    • 1.1 模块声明类
    • 1.2 端口声明
    • 1.3 parameter
    • 1.4 内部信号wire,reg
    • 1.5 循环语句for
    • 1.6 assign语句
    • 1.7 always进程块
    • 1.8运算操作符
    • 1.9赋值符号=(阻塞)、<=(非阻塞)
  • 二、不可综合的语法子集
    • 2.1 所有工具都不支持的结构
    • 2.2 有些工具支持有些工具不支持的结构

硬件描述语言(HDL)是用来描述 数字电路和设计 数字逻辑系统的语言。 Verilog HDL是硬件描述语言的一种,用于数字电子系统设计,是目前应用最为广泛的一种硬件语言。

一、可综合的语法子集

可综合的语法是指硬件能够实现的语法,这些语法可以通过综合工具编译最终生成用于烧录到FPGA的配置数据流。
所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,not,if,inout,input,module,negedge,posedge,output,parameter…

1.1 模块声明类

模块的端口声明了模块的输入输出口。例:

module adder(count,sum,a,b,cin);
input [2:0] a,b;
input cin;
output count;
output [2:0] sum;
assign {count,sum} = a + b + cin;
endmodule

1.2 端口声明

每一个module都会有输入和输出信号用于和外部器件或者其它模块通信。这些输入输出端口可以分为三类:inputoutputinout(双向)。

1.3 parameter

parameter来定义常量。在每一个赋值语句的右边必须是一个常数表达式。也就是说,该表达式只能包含数字或先前已定义过的参数:

parameter msb=7; //定义参数msb为常量7 
parameter e=25, f=29; //定义二个常数参数 
parameter r=5.7; //声明r为一个实型参数 
parameter byte_size=8, byte_msb=byte_size-1; //用常数表达式赋值 
parameter average_delay = (r+f)/2; //用常数表达式赋值 

参数型常数经常用于定义延迟时间和变量宽度。在模块或实例引用时可通过参数传递改变在被引用模块或实例中已定义的参数,例:
在引用Decode实例时,D1,D2的Width将采用不同的值4和5,且D1的Polarity将为0。可用例子中所用的方法来改变参数,即用 #(4,0)向D1中传递 Width=4,Polarity=0; 用#(5)向D2中传递Width=5,Polarity仍为1。

module Decode(A,F); 
parameter Width=1, Polarity=1; 
...
endmodule 

module Top; 
wire [3:0]A4; 
wire [4:0]A5; 
wire [15:0]F16; 
wire [31:0]F32; 
Decode #(4,0) D1(A4,F16); 
Decode #(5) D2(A5,F32); 
endmodule 

1.4 内部信号wire,reg

reg(寄存器):当时钟上升沿到来时,可以锁存最新的输入数据。reg型数据常用来表示用于“always”模块内的指定信号,常代表触发器。reg型只表示被定义的信号将用在“always”块内。而wire可以理解为“导线”。
在一个module里面,inputinout只能定义为wire类型,output默认为wire类型,也可定义为reg类型。

1.5 循环语句for

用的比较少。其用法和C语言类似,例如对memory进行初始化:

begin: init_mem 
reg[7:0] tempi; 
for(tempi=0;tempi<memsize;tempi=tempi+1) 
memory[tempi]=0; 
end 

1.6 assign语句

采用“assign”语句是描述组合逻辑最常用的方法之一。用来对wire型变量进行赋值。该语句不能用于always进程块中。

assign a = b & c;

1.7 always进程块

always”块既可用于描述组合逻辑也可描述时序逻辑。always进程块中,只能对reg型变量赋值
组合逻辑:

always@(*)
begin
  //具体逻辑
end

always后如果有沿信号(上升沿,下降沿),则多为时序逻辑。

always@(沿信号1 or 沿信号2)
begin
  //具体逻辑
end

1.8运算操作符

verilog中绝大多数运算操作符都是可综合的:+(加)、-(减)、!(非)、~(取反)、&(与)、|(或)、*(乘)、/(除)、&&(逻辑与)、||(逻辑或)、==(逻辑相等)、!=(逻辑不等)等等。

1.9赋值符号=(阻塞)、<=(非阻塞)

非阻塞赋值只能用于reg型变量。
always进程块内,多条非阻塞赋值同时执行(并行),阻塞赋值按照顺序执行

二、不可综合的语法子集

2.1 所有工具都不支持的结构

time,defparam,$finish,fork,join,initial,delays,UDP,wait

2.2 有些工具支持有些工具不支持的结构

casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while

​"FPGA Zone" 专注 FPGA 知识学习与工程应用,欢迎 FPGA 爱好者关注公众号,领取 200G+ FPGA 相关学习资料!

你可能感兴趣的:(verilog,fpga)