(1)任务
 **任务类似于一段程序,可以提供一种能力,使设计者可以从设计描述的不同位置执行共同的代码段。任务可以包含时序控制,
 可以调用其它任务和函数。
 
 任务的定义格式:

 task[automatic] task_id;
[declarations]
procedural_statement
endtask

**任务可以没有参变量,也可以有多个参变量,包括input,output,inout。

示例:

 module esoc;
parameter MAX = ;
task reverse_bits;
input [MAX-:] data_in;
output [MAX-:] data_out;
integer k; begin
for(k=; k<MAX; k=k+)
data_out[MAX--k] = data_in[k];
end
endtask
...
endmodule

**任务可以在其范围内声明任何变量,但仅限于其范围内使用,为局部变量。

**关于automatic:
  任务可以被声明为automatic类型。在这样的任务中,任务内部声明的所有局部变量在每一次任务调用时都进行动态分配,
 即在任务调用中的局部变量不会对两个单独或者并发的任务调用产生影响。而在静态(非自动类型)任务中,在每一次任
 务调用中的局部变量都使用同一个存储空间。借助于关键字automatic就可以把任务指定为automatic类型。

task automatic rotate;
integer mac;
...;
endtask
 **任务的调用:
 格式:task_id[(expr1, expr2, expr3, ...)]; 必须按定义的顺序匹配。
 示例:

module golobal_var;
reg[:]qram[:];
integer index;
reg check_bit; task get_parity;
input [:]address;
output parity_bit;
parity_bit = ^qram[address];
endtask initial
for(index=; index<=; index = index+)
begin
get_parity(index, check_bit);
$display("Parity bit of memory word %d is %b.",index, check_bit);
end
endmodule

**系统任务
 
 *显示任务:
  (a)显示、读写 :$display, $write
  (b)选通:$strobe
  (c)监控:$monitor
 
 *文件传输
  (a)打开、关闭文件:$fopen, $fclose
     输出到文件:$fdisplay, $fwrite, $fstrobe, $fmonitor, $fflush
     从文件读取数据:$readmemb, $fread...

 integer file_pointer = $fopen(file_name, mode);
$fclose(file_pointer);

mode:

"r","rb":打开文件并从文件的头开始读。如果文件不存在就报的错。
   "w","wb":打开文件并从文件的头开始写。如果文件不存在就创建文件。
   "a","ab":打开文件并从文件的末尾开始写。如果文件不存在就创建文件。
   "r+","r+b","rb":打开文件并从文件的头开始读写。如果文件不存在就报的错。
   "w+","w+b","wb":打开文件并从文件的头开始读写。如果文件不存在就创建文。
   "a+","a+b","ab":打开文件并从文件的末尾开始读写。如果文件不存在就创建文件。
   "b"是在打开二进制文件时引用。
  
  (b)时间标度:
   显示模块的时间单位和时间精度:$printtimescale
   指定如何报告时间信息:$timeformat

  $timeformat(units_number, precision, suffix, numeric_filed_width);

(c)仿真任务:

使仿真器退出仿真环境:$finish
   仿真中止:$stop
 

(2)函数
 **类似于任务,可以在不同位置执行共同的代码段,不同的是,函数只能返回一个值,不能包含任何延迟,必须立即执行,
不能调用任何其它任务,输入必须至少有一个,不允许有inout,output的声明;可以调用其它函数。
 
 **定义:

 function [automatic][signed]
[range_of_type] function_id; //function_id为返回的值
input_declaration
other_declarations
procedural_statement
endfunction
//或
function [automatic][signed]
[range_of_type] function_id(input_declaration);
other_declarations
procedural_statement
endfunction

**函数的调用:
 格式:func_id(expr1, expr2, expr3, ...)
 
 **系统函数
 (a)仿真时间函数:$time, $stime, $realtime; // 返回64位,32位,实型仿真时间
 
 (b)转换函数:
  $rtoi(real_value)        $itor(integer_value),
  $realtobits(real_value)  $bitstoreal(bit_value),
  $signed(value)           $unsigned(value)
 
 (c)概率分布函数:$random ...
 
 (d)字符串格式化:$swrite, $sformat, $sscanf

(3)禁止语句
 
 **禁止语句是过程性语句,只能出现在always和initial中,禁止语句可以终止任务或程序块的执行,能够用于硬件中断和全局复位的建模。
 
 *格式:

  disable task_id;
disable bolck_id;

(4)命名事件
 
 命名事件是Verilog的另一种数据类型(其他两种是变量和线网)。
 声明格式:event ready, done;
 使用格式:->ready; ->done;
 
 示例:异步状态机

 event state1, state2, state3;
//复位状态
initial begin
->state1;
end
always@(state1)begin
->state2;
end
always@(state2)begin
->state3;
end
always@(state3)begin
if(input_a) ->state2;
else ->state1;
end

No.6 Verilog 其他论题的更多相关文章

  1. Verilog学习笔记简单功能实现(二)...............全加器

    先以一位全加器为例:Xi.Yi代表两个加数,Cin是地位进位信号,Cout是向高位的进位信号.列表有:   Xi     Yi    Cin Sum Cout 0 0 0 0 0 0 0 1 1 0 ...

  2. Verilog HDL模型的不同抽象级别

    所谓不同的抽象类别,实际上是指同一个物理电路,可以在不同层次上用Verilog语言来描述.如果只从行为功能的角度来描述某一电路模块,就称作行为模块.如果从电路结构的角度来描述该电路模块,就称作结构模块 ...

  3. Verilog学习笔记基本语法篇(十二)········ 编译预处理

    h Verilog HDL语言和C语言一样也提供编译预处理的功能.在Verilog中为了和一般的语句相区别,这些预处理语句以符号"`"开头,注意,这个字符位于主键盘的左上角,其对应 ...

  4. Verilog学习笔记基本语法篇(十一)········ 常用系统函数

    1)系统任务:$monitor   格式: $monitor(p1,p2,p3...pn); $monitor; $monitoron; $monitoroff; 任务$monitor提供了监控输出列 ...

  5. FPGA作为从机与STM32进行SPI协议通信---Verilog实现 [转]

    一.SPI协议简要介绍 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用 ...

  6. 基于Verilog HDL整数乘法器设计与仿真验证

    基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为 ...

  7. system verilog中的跳转操作

    在verilog中,使用disable声明来从执行流程中的某一点跳转到另一点.特别地,disable声明使执行流程跳转到标注名字的声明组末尾,或者一个任务的末尾. verilog中的disable命令 ...

  8. system verilog中的类型转换(type casting)、位宽转换(size casting)和符号转换(sign casting)

    类型转换 verilog中,任何类型的任何数值都用来给任何类型赋值.verilog使用赋值语句自动将一种类型的数值转换为另一种类型. 例如,当一个wire类型赋值给一个reg类型的变量时,wire类型 ...

  9. 一段比较有意思的代码——介绍system verilog中的新增幅值语句

    system verilog中新加了很多幅值语句,虽然都只适用于阻塞幅值,但是在某些场合中非常实用. 下面是一段有意思的代码,覆盖了一些用法. package definitions; typedef ...

随机推荐

  1. JS倒计时两种种实现方式 很不错

    最近做浏览器界面倒计时,用js就实现,两种方式: 一:设置时长,进行倒计时.比如考试时间等等 代码如下: <html> <head> <meta charset=&quo ...

  2. [转]浅谈C#中常见的委托

    一提到委托,浮现在我们脑海中的大概是听的最多的就是类似C++的函数指针吧,呵呵,至少我的第一个反应是这样的. 关于委托的定义和使用,已经有诸多的人讲解过,并且讲解细致入微,尤其是张子阳的那一篇.我就不 ...

  3. 前端页面布局之Grid布局

    在讲布局前,先说两句题外话,写博时,突然想到了郭德纲说过的一个段子“说两个人骂架,不是你有理,你嗓门大,你唾沫星子崩我一脸,你就能骂赢,要看谁命长,过两年你死了,我站你坟头咋说咋是对的,你在那小匣里还 ...

  4. C++中int型与char型相互转换的问题

    参考:https://www.cnblogs.com/dj-917366761-bg/p/7078078.html 主要针对0~9这几个数字. 可以借助 ‘0’. char 转 int —— int ...

  5. 从web.xml入手分析jeecms配置文件

      web.xml文件是web系统的核心配置文件,里面的所有配置都会加载的运行时的web容器,从她可以了解到整个web项目的配置情况.jeecms的所有配置文件都在config文件夹下面,通过web. ...

  6. TZOJ 3042 切蛋糕(并查集)

    描述 KK是个心灵手巧的好姑娘,她做了一个大蛋糕请她的好朋友们来品尝.这个蛋糕分成n×n个正方形小格,每个小格包含一块水果.KK要把蛋糕切成若干块,显然她不会破坏任意一个小格.无聊的某同学在她切蛋糕时 ...

  7. 如何将本地项目上传到Git 版本库

    1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...

  8. 利用Qt自带工具发布程序

    Qt官方开发环境生成的exe发布方式--使用windeployqt 从开始菜单-->Qt 5.4.0-->5.4-->MinGW 4.9 (32-bit)-->Qt 5.4 f ...

  9. TZ_01MyBatis_log4j.propertiies

    # Set root category priority to INFO and its only appender to CONSOLE. #log4j.rootCategory=INFO, CON ...

  10. 转var,let,const,js严格模式的详解

    最近看微信公众账号/知乎网上的文章说,现在的前端的人都注重用什么框架,一问原生js感觉都没有用到工作中.用不到的,学这些意义没有.上午我刚面试了一个前端,工作4年吧.最初是北大青鸟培训的,做后端.ne ...