verilog笔记--$time、$realtime、初始化存储器、$random、`timescale

文章讨论了VHDL中$time与$realtime函数的区别,$time始终输出整数,而$realtime不取整,可能导致输出差异。还介绍了存储器的初始化过程,包括通过$readmemb和$readmemh系统任务从数据文件加载内容,并强调了地址指定的重要性。此外,文章提到了$random函数用于生成随机脉冲的应用。
摘要由CSDN通过智能技术生成

1. $time与$realtime
区别在于:
t i m e 总是输出整数,在将经过尺度比例变换的数字输出时,要先进行取整, time总是输出整数,在将经过尺度比例变换的数字输出时,要先进行取整, time总是输出整数,在将经过尺度比例变换的数字输出时,要先进行取整,realtime语句不会对输出进行取整,从而导致二者输出效果的差异。

`timescale 10 ns / 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

`timescale 10 ns / 1ns
	module test;
	reg set;
	parameter   p = 1.6;
	initial
		begin
		$monitor($realtime, , "set = ",set);
		#p  set = 0;
		#p  set = 1;
		end
endmodule

输出结果为:
0 set = x
1.6 set = 0
3.2 set = 1

2.初始化存储器
当数据文件被读取时,每一个被读取的数字都被存放到地址连续的存储器单元中去,存储器单元的存放地址范围由系统任务声明语句中的起始地址和结束地址中书名,每一个数据的存放地址再数据文件中说明。格式为:
@+16进制数
当系统任务遇到一个地址说明时,系统任务将该地址后的数据存放到存储器中相应的地址单元中。

//	初始化存储器
module  test;

reg[7:0]    memory[0:7];//声明有八个八位的存储单元
integer   i;

initial
	begin
	// 读取存储器文件 init.dat 到存储器中的给定地址
	$readmemb("init.dat", memory);
	// 显示初始化后的存储器内容
	for (i = 0; i < 8; i = i + 1)
		$display("Memory[%d] = %b", i, momory[i]);

end

注意:
①如果系统任务声明语句中和数据文件中都没有进行地址说明,则默认的存放起始地址为该存储器定义语句中的起始位置,数据文件中的数据被连续存放到该存储器中,直到存储单元存满,数据文件里的数据存完。
②如果在系统任务声明语句中,起始地址和结束地址都进行了说明,则数据按照该地址存放,不考虑存储器的定义语句中的地址;
③若数据个数与地址存放位置不同,提示错误信息

// 定义一个有256个地址的字节存储器 mem
reg[7:0] mem[1:256]

//分别使用不同的系统任务装载
initial  $readmemh("mem.dat", mem);
initial  $readmemh("mem.dat", mem,16);
initial  $readmemh("mem.dat", mem ,128,1);

第一条语句在仿真时刻为零时,将装在数据到以地址是1的存储器单元为七十存放单元的存储器中去。在第二条语句中将存储数据到以单元地址是16的存储器单元为起始存放单元的存储器中去,一直到地址是256的单元为止。第三条语句将从地址是128的单元开始装在数据,一直到地址为1的单元。在第三条语句中,系统要检查在数据文件里是否有128个数据,如果没有,则报错。

3.$random语句用于生成随机脉冲或宽度随机的脉冲序列

`timescale  1 ns / 1 ns
module random_pulse(dout);
output[9:0] dout;
reg[9:0]  dout;

integer delay1, delay2, k;
initial
	begin
	#10 dout = 0;
	for (k = 0; k < 100; k = k + 1)
		begin
			delay1 = 20 * ({ $random } % 6);
			// delay1 在 0~100 ns间变化
			delay2 = 20 * (1 + {$random} % 3);
			// delay2 在20~60ns间变化
			#delay1  dout = 1 << ({random} % 10);
			// dout的0~9位中随机出现1,并出现的时间在0~100ns间变化
			#delay2  dout = 0;
			// 脉冲的宽度在20~60ns间变化
		end
	end
endmodule

4.时间尺度 `timescale
时间尺度用来说明跟在该指令后的模块的时间单位和时间精度,可以实现该命令在同一个设计里采用不同单位的时间单位的模块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值