用读取文件$readmemh,$readmemb的方法初始化memory

1、环境变量PATH

程序是由操作系统执行 是吧!要执行程序,你的找到它吧,这就是 PATH 环境变量做的事。
比如 win下PATH中的路径,是指在DOS下,你可以直接输入一个可执行文件的名字,它就能就行了。否则,就要先 cd 到那个可执行文件所在的目录下,之后才能在DOS直接输入名字运行。

2、$readmemh readmemb

$readmemb ("<数据文件名>",<存贮器名>,<起始地址>,<结束地址>)
$readmemb("<数据文件名>",<存贮器名>
下面举例说明: 先定义一个有256个地址的字节存贮器
mem: reg[7:0] mem[1:256];
下面给出的系统任务以各自不同的方式装载数据到存贮器mem中。
initial $readmemh("mem.data",mem);
initial $readmemh("mem.data",mem,16);
initial $readmemh("mem.data",mem,128,1);
第一条语句在仿真时刻为0时,将装载数据到以地址是1的存贮器单元为起始存放单元的存贮器中去。
第二条语句将装载数据到以单元地址是16的存贮器单元为起始存放单元的存贮器中去,一直到地址是256的单元为止。
第三条语句将从地址是128的单元开始装载数据,一直到地址为1的单元。在第三种情况中,当装载完毕,系统要检查在数据文件里是否有128个数据,如果没有,系统将提示错误信息。
文件可以包含显式的地址形式。
形式一

11001
11010

形式二:对指定地址进行赋值(地址是十六进制的数)
@hex_address value

@5 11001000 // 将11001存入mem[5]
@2 11010000 //将11010存入mem[2]

@5   //以直至5开始
 11001000
 00000000
 111111111

在这种情况下,值被读入存储器指定的地址。
命名规则:reg[n-1:0] 存储器名[m-1:0]

说明:这是m个n位的存储器,该存储器的地址范围是0-(m-1)

举例:reg[3:0] memo[255:0]

说明:这是256个4位存储器,该存储器地址范围是0-255

赋值:memo[200] = 4'b1010;

说明:给第200地址单元赋值4'b1010;

精确到位:memo[56][2]

说明:第56地址的第2位数据

赋值:wire data=memo[56][1];

说明:把memo中第56地址的第1位数据赋值给data;
integer类型也是一种寄存器数据类型,integer类型的变量为有符号数,而reg类型的变量则为无符号数,除非特别声明为有符号数,还有就是integer的位宽为宿主机的字的位数,但最小为32位,用integer的变量都可以用reg定义,只是对于用于计数更方便而已。reg,integer,real,time都是寄存器数据类型,定义在Verilog中用来保存数值的变量,和实际的硬件电路中的寄存器有区别

今天看代码时遇到了integer,只知道这是个整数类型,可详细的内容却一窍不通,查看了资料---《verilog数字VLSI设计教程》。其中是这么写到的:
大多数的矢量类型(reg或者net)都被默认当做无符号数。integer和real是个例外,它们被默认为当做有符号数。通常,real类型是不可综合的。
假设在没有溢出的情况下,不管是无符号数还是有符号数,它们都是二进制的一串数值而已;而当这个值被当做某种类型比较时:又符号数的MSB被用来表示这个数字的符号,而无符号数的MSB则是位权最高的那一位。无论采用什么样的二进制格式,一个无符号数永远也不能成为负值。采用integer配合FOR语句,行数比较少,但是integer不能综合,只能用来仿真。

位拼接符号的使用时的注意事项

问题一
reg [7:0] reg2;
reg2<={2'b11,reg2};//不能实现预定的功能;
reg2<={reg2,2'b11,};//能实现预定的功能;
reg2<={2'b11,reg2[7:2]};能实现预定的功能;

在利用拼接符号时,一定要指定每一个元素的位宽;在位拼接表达式中不允许存在没有指明位数的信号

在想允许综合的风格代码中,一般不对RAM复位
RAM一般会占用大量的面积,所以不是用综合出来的RAM

posted on 2018-04-19 17:05  猪肉白菜_125  阅读(11266)  评论(0编辑  收藏  举报