verilog可综合的语法子集

描述

可综合的语法是指硬件能够实现的一些语法,这些语法能够被EDA工具支持,能够通过编译最终生成用于烧录到FPGA器件中的配置数据流。

一、模块声明类语法:module...endmodule

每个verilog文件中都会出现模块声明类语法,它是一个固定的用法,所有的功能实现都应该包含在...之中。示例如下:

module my_first_prj(<端口信号列表>...)

<逻辑代码>...

endmodule

二、端口声明:input,output,inout

每一个module都会有输入/输出的信号用于和外部器件或其它module通信衔接。对于本地module而言,这些信号可以归为三类,即输入(input)信号、输出(output)信号和双向(inout)信号。示例如下:

input sys_clk;

 input wite rst_n;

input[7:0] data_in;

三、参数定义:parameter

Parameter用于申明一些常量,主要是便于模块的移植或升级时的修改。示例如下:

module<模块命名>(<端口命名1>,<端口命名2>,...);

//输入端口申明

 input<端口命名1>;

input wire<端口命名2>;

input[<最高位>:<最低位>]<端口命名3>;

 ...

//输出端口申明

 output<端口命名4>;

output[<最高位>:<最低位>]<端口命名5>;

output reg[<最高位>:<最低位>]<端口命名6>;

...

//参数定义

parameter<参数命名1>=<默认值1>;

parameter[<最高位>:<最低位>]<参数命名2>=<默认值2>;

...

//具体功能逻辑代码

...

endmodule

四、信号类型:wite,reg等

在下图所示的简单电路中,分别定义两个寄存器(reg)锁存当前的输入din。每个时钟clk上升沿到来时,reg都会锁存到新的输入数据,而wire就是这两个reg之间直接的连线。 //图 作为input或inout的信号端口只能是wire型,而作为output的信号端口则可以是wire或reg。示例如下:

//定义一个wire信号

wire;变量名>

//给一个定义的wire信号直接连接赋值

//该定义等同于分别定义一个wire信号和使用assign语句进行赋值

wire=<常量或变量赋值>;变量名>

//定义一个多bit的wire信号

wire[<最高位>:<最低位>];变量名>

//定义一个reg信号

reg;变量名>

//定义一个赋初值的reg信号

reg=<初始值>;变量名>

//定义一个多bit的reg信号

reg[<最高位>:<最低位>];变量名>

//定义一个赋初值的多bit的reg信号

reg[<最高位>:<最低位>]=<初始值>;变量名>

//定义一个二维的多bit的reg信号

reg[<最高位>:<最低位>][<最高位>:<最低位>];变量名>

多语句定义:begin...end

//含有命名的begin语句

begin:<块名>

//可选申明部分

//具体逻辑

end

//基本的begin语句

 begin

//可选申明部分

//具体逻辑

end

五、比较判断:if...else,case...default...endcase

示例如下:

 //if判断语句

if(<判断条件>)

begin

//具体逻辑

 end

//if...else判断语句

if(<判断条件>)

 begin

//具体逻辑1

end

 else

begin

//具体逻辑2

 end

//if...else if ...else判断语句

 if(<判断条件1>)

begin

//具体逻辑1

 end

 else if(<判断条件2>)

 begin

 //具体逻辑2

 end

else

begin

//具体逻辑3

 end

//case语句

 case(<判断变量>);

<取值1>:<具体逻辑1>

 <取值2>:<具体逻辑2>

<取值3>:<具体逻辑3>

 default:<具体逻辑4>

 endcase

六、循环语句:for

使用较少,示例如下: 

//for语句

for(<变量名>=<初值>;<判断表达式>;<变量名>=<新值>)

begin

//具体逻辑

 end

七、任务定义:task...endtask

task类似于C的子函数,可以有input、output和inout端口作为输入口参数,可以用来实现单时序控制,无返回值,不可用于表达式之中。示例如下: 

task;命名>

//可选申明部分,如本地变量申明

 begin

 //具体逻辑

 end

 endtask

八、连续赋值:assign,问号表达式(?:)

Assign用于直接互连不同的信号或者直接给wire变量赋值。其基本用法如下: assign=<变量或常量>;变量名> ?:表达式就是简单的if...else语句,示例如下: 

(判断条件)?(判断条件为真时的逻辑处理):(判断条件为假时的逻辑处理)

九、always模块

敏感表可以为电平、沿信号posedge/negedge,通常和@连用。组合逻辑的用法如下: 

always@(*)

 begin

 //具体逻辑

 end

always之后若有沿信号(上升沿posedge,下降沿negedge)申明,则多为时序逻辑,用法如下:

 //单个沿触发的时序逻辑

 always@(<沿变化>)

 begin

 //具体逻辑

 end

always@(<沿变化1> or <沿变化2>)

begin

 //具体逻辑

end

十、运算操作符

包括逻辑操作符、移位操作符、算术操作符大多可以进行综合,列表如下:

+ //加 

- //减 ! //逻辑非 ~ //取反 & //与 ~& //与非 | //或 ~| //或非 ^ //异或 ^~ //同或 ~^ //同或

* //乘,是否可综合看综合工具 / //除,是否可综合看综合工具 % //取模 << //逻辑左移

>> //逻辑右移 < //小于 <= //小于等于 < //大于 = //大于等于 == //逻辑相等 != //逻辑不相等 && //逻辑与 || //逻辑或

十一、赋值符号:=和<=

分别为阻塞赋值和非阻塞赋值,后续博客详细介绍。

以上便是Verilog基础语法,在RTL设计中,需要掌握。


  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分