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信号直接连接赋值 

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

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

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

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

//定义一个reg信号 

reg<reg变量名>; 

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

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

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

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

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

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

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

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<task命名>; 

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

 begin

 //具体逻辑

 end

 endtask

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

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

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

九、always模块

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

always@(*)

 begin

 //具体逻辑

 end 

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

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

 always@(<沿变化>)

 begin

 //具体逻辑

 end 

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

begin

 //具体逻辑 

end

十、运算操作符

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

+ //加 

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

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

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

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

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值