EDA总结(3)

2019-06-04 22:16

变量=<函数名> (<表达式>, <表达式>, ??);

其中,函数名作为确认符。 (4)函数的使用规则:

●函数的定义不能包含有任何的时间控制语句,即任何用#、@或wait 来标识的语句;

●函数不能启动任务;

●定义函数时至少要有一个输入参数;

●在函数的定义中必须有一条赋值语句给函数的一个内部变量赋结果 值,该内部变量和函数同名。 (5)函数的使用举例 1.奇偶校验位 1)偶校验

偶校验——数据中“1”的个数为偶数的时候,这个校验位就是“0”,否则这个校验位就是“1”。即加上校验位,1的个数始终为偶数。 module parity; reg [31:0] addr;

reg parity; initial begin

addr=32’h3456_789a; #10 addr=32’hc4c6_78ff; #10 addr=32’hff56_ff9a; #10 addr=32’h3faa_aaaa

end

//每当地址值发生变化,计算新的偶校验位 always @(addr) bein

parity=calc_parity(addr);

$display(“Parity calculated=%b”,cal_parity(addr)); end

//定义偶校验计算函数 function calc_parity;

input [31:0] address; begin

calc_parity= ^address;//返回所有地址位的异或值 end endfunction endmodule 2)奇校验

2.左/右移位寄存器

module shifter;

`define LEFT_SHIFT 1’b0 `define RIGHT_SHIFT 1’b1 reg [31:0] addr,left_addr,right_addr; reg control; always @(addr)

begin

left_addr=shift(addr,`LEFT_SHIFT); right_addr=shift(addr,`RIGHT_SHIFT); end

function [31:0] shift; input [31:0] address; input control;

begin

shift=(control==`LEFT_SHIFT)?(address<<1):(address>>1); end

endfunction endmodule

6.常用的系统任务

(1)$display和$write任务

格式:

$display(p1,p2,?,pn); $write(p1,p2,?,pn);

这两个函数和系统任务是用来输出信息,即将参数p2~pn按参数p1给定的格式输出。参数p1通常称为“格式控制”,参数p2~pn通常称为“输出表列”。这两个任务的作用基本相同。

$display自动地在输出后进行换行,$write则不进行自动换行。如果想在一行里输出多个信息,可以使用$write。在$display和$write中,其输出格式控制是用双引号括起来的字符串。 输出数据的显示宽度:

可以通过在%和表示进制的字符中间插入一个0,便自动调整显示输出数据宽度的方式。见下例:

$display(“d=%0h a=%0h”,data,addr);

这样在显示输出数据时,在经过格式转换以后,总是用最少的位数来显示表达式的当前值。 如果输出列表中表达式的值包含有不确定的值或高阻值,其结果输出遵循以下规则。 ●如果表达式值的所有位均为不定值,则输出结果为小写的x;部分位为不定制,则输出大写的X;

●如果表达式值的所有位均为高阻值,则输出结果为小写的z;部分位为高阻值,则输出大写的Z。

在输出格式为十六进制和八进制的情况下,每个x或z表示每4位或每3位的二进制数: 对于二进制输出格式,表达式值的每一位的输出结果为0、1、x、z。下面举例说明: $display(‘‘%d”,1’bx); x $display(“%h”,14’bx0_1010); xxXa $display(“%h%o”,12’b001x_xx10_1x01,12’b001_xxx_101_x01); XXX 1x5X

7.选通显示

$strobe系统任务

$strobe系统任务与$display使用方法相同。 它们之间的区别在于:

如果许多其他语句与$display任务在同一个时间单位执行,那么这些语句与$display任务的执行顺序是不确定的。

而$strobe总是在同时刻的其他赋值语句执行完成后才执行。 always @(posedge clock) begin a=b; c=d; end

always @(posedge clock)

$strobe(“Displaying a=%b,c=%b”,a,c); //在a、b被赋值后才执行

十六.调试用系统任务和常用编译预处理语句

1 系统任务$monitor

格式:

$monitor(p1,p2,?,pn);

作用:监控和输出参数列表中的表达式或变量值。其参数列表的规则和$display一样。 每当参数列表中变量或表达式的值发生变化时,将自动输出显示。 在$monitor中,参数可以是$time系统函数。

$monitor($time,,“rxd=%b txd=%b”,rxd,txd); 注:, ,表示空参数,显示为空格。

$monitor与$display的不同之处还在于$monitor往往在initial块中调用,只要不调用$monitoroff,$monitor便不间断地对其所设定的信号进行监视。

2 时间度量系统函数$time

1)系统函数$time(整型时间值)

$time可以返回一个以64位的整数来表示当前的仿真时刻值。该时刻是以模块的仿真时间尺度为基准的。下面举例说明。

`timescale 10 ns/1ns//表示时间长度的具体值,精确到0.1ns module test; reg set;

parameter p=1.6; initial

begin

$monitor($time,,“set=”,set); #p set=0; #p set=1; end

endmodule 输出结果为: 0 set=x

2 set=0

3 set=1

2)$realtime系统函数

$realtime和$time的作用是一样的,只是$realtime返回的时间数字是一个实型数,该数字也是以时间尺度为基准的。下面举例说明: `timescale 10ns/1ns module test;

reg set;

parameter p=1.55;//先四舍五入 Initial //再延迟 begin

$monitor($realtime,,“set=”,set); #p set=0: #p set=1; end endmodule

3 系统任务$random

该函数返回一个32位的随机数,它是一个带符号的整型数。

$random一般的用法是:$random%b,其中b>0。它给出了一个范围在(-b+1):(b-1)中的随机数。下面给出一个产生随机数的例子: reg [23:0]rand; rand=$random%60;

上面的例子给出了一个范围在-59到59之间的随机数,下面的例子通过位拼接操作产生一个值在0~59之间的数。

reg[23:0]rand; rand={$random}%60; 拼接运算是相对于无符号数而言的

4 编译预处理

1宏定义'define

用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为: `define标识符(宏名) 字符串(宏内容)

这种方法使用户能以一个简单的名字代替一个长的字符串,也可以用一个有含义的名字来代替没有含义的数字和符号,因此把这个标识符(名字)称为“宏名”。在编译预处理时将宏名替换成字符串的过程称为“宏展开”。`define是宏定义命令。 2“文件包含”处理'include

所谓“文件包含”处理是一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。Verilog HDL语言提供了'include命令来实现“文件包含”的操作。其一般形式为: `include “文件名” 3 时间尺度timescale

`timescale命令用来说明跟在该命令后的模块的时间单位和时间精度。 `timescale命令的格式如下:`timescale<时间单位>/<时间精度>

如果在同一个程序设计里,存在多个’timescale命令,则用最小的时间精度值来决定仿真的时间单位。另外时间精度至少要和时间单位一样精确,时间精度值不能大于时间单位值。 在`timescale命令中,用于说明时间单位和时间精度参量值的数字必须是整数,其有效数字为1,10,100,单位为s,ms,us,ns,ps,fs `timescale命令的用法

`timescale 1ns/1ps;

在这个命令之后,模块中所有的时间值都表示是1 ns的整数倍。这是因为在‘timescale命令中,定义了时间单位为1 ns。模块中的延迟时间可表达为带3位小数的实型数,因为’timescale命令定义时间精度为1 ps。 9.1 门级结构描述

8个基本的门类型关键字和它们所表示的门的类型: and —— 与门; nand —— 与非门; nor —— 或非门; or —— 或门; xor —— 异或门; xnor ——同或门;

buf —— 缓冲器; not —— 非门。 门声明语句的格式如下:

<门的类型>[<驱动能力><延时>]<门实例1>[,<门实例2>,?,<门实例n>]; 门的类型是门声明语句所必须的,驱动能力和延时是可选项。 例如:

nand #10 nd1(a,data,clock,clear);

该例说明在模块中使用了一个名为nd1的与非门(nand),输入为data、clock和clear,输出为a,输出与输入的延时为10个单位时间。 用触发器组成带清零端的4位寄存器。 `include “flop.v”

module hardreg(d,clk,clrb,q); Input clk,clrb;

input [3:0] d; output [3:0] q;

flop f1(d[0],clk,clrb,q[0],), //注意结束时用逗号,最后才用分号 f2(d[1],clk,clrb,q[1],), //表示f1到f4都是flop f3(d[2],clk,clrb,q[2],), f4(d[3],clk,clrb,q[3],); endmodule

module flop(data,clock,clear,q,qb); input data,clock,clear;

output q,qb;

nand #10 nd1(a,data,clock,clear), //注意结束时用逗号,最后才用分号 nd2(b,ndata,clock),//表示nd1到nd8都是nand(与非门) nd4(d,c,b,clear), nd5(e,c,nclock), nd6(f,d,nclock), nd8(qb,q,f,clear); nand #9 nd3(c,a,d),

nd7(q,e,qb); not #10 iv1(ndata,data),

iv2(nclock,clock); endmodule

用行为描述的方法来描述带清零端的4位寄存器。

module hardreg(d,clk,clrb,q);


EDA总结(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:审计报告无法出具

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: