引言
重新拾起Verilog吧,从各种渠道,补充自己不知道的知识,加深对Verilog的认识。本文将在不断学习过程中,加深对Verilog的认识,并在使用过程中,不断加深对语法的理解程度和灵活应用
参考资料: 志芯科技bilibili视频
参考资料:verilog夏宇闻
1 基础
文件名最好和模块的顶层名字一致。
模块声明的时候输入必须是wire变量,输出可以是wire变量,也可以是reg变量
而测试模块,处于真正的顶层,所以没有输入输出接口,因此只需要写module 模块名字 ;
case对应的是译码器,可以产生比if else 更快的效果。
2 task与function
学会task和function可以简化程序的结构,是编写大型模块的基本功底
推荐blog
2.1 task
task <task name>;
<port and data type declare>;
<statement 1>;
<statement 2>;
<statement 3>;
...
endtask
调用task
<任务名>(端口1,端口2。。。端口n)
(1)在第一行task语句中不能列出端口名称; (2)任务的输入、输出端口和双向端口数量不受限制,甚至可以没有输入、输出以及 双向端口。
(3)在任务定义的描述语句中,可以使用出现不可综合操作符合语句(使用最为频繁 的就是延迟控制语句) ,但这样会造成该任务不可综合。
(4)在任务中可以调用其他的任务或函数,也可以调用自身。 (5)在任务定义结构内不能出现initial和 always过程块。
(6)在任务定义中可以出现“disable 中止语句” ,将中断正在执行的任务,但其是不
可综合的。当任务被中断后,程序流程将返回到调用任务的地方继续向下执行。
任务的调用: 任务中不能出现initial 语句和always 语句语句, 但任务调用语句可以在initial语句和 always
语句中使用。 任务调用语句中,参数列表的顺序必须与任务定义中的端口声明顺序相同。
任务调用语句是过程性语句,所以任务调用中接收返回数据的变量必须是寄存器类型。
在写testbench时,用task来产生数据非常方便
task send_data(len); //任务的声明
integer len,i;//变量声明
begin
for(i=9;i<len;i=i+1)
begin
@(p
Verilog高级编程技巧

本文深入探讨Verilog语言的高级特性,包括task与function的使用、拼接与移位操作、文件读写及时间函数详解,旨在提升Verilog编程技能。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



