欢迎来到天天文库
浏览记录
ID:21752220
大小:181.50 KB
页数:11页
时间:2018-10-20
《第16章 verilog 存储器建模》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第16章存储器建模学习内容:如何描述存储器如何描述双向端口存储器件建模描述存储器必须做两件事:说明一个适当容量的存储器。提供内容访问的级别,例如:只读读和写写同时读多个读操作,同时进行单个写操作同时有多个读和多个写操作,有保证一致性的方法简单ROM描述下面的ROM描述中使用二维寄存器组定义了一个存储器mem。ROM的数据单独保存在文件my_rom_data中,如右边所示。通常用这种方法使ROM数据独立于ROM描述。`timescale1ns/10psmodulemyrom(read_data,addr,read
2、_en_);inputread_en_;input[3:0]addr;output[3:0]read_data;reg[3:0]read_data;reg[3:0]mem[0:15];initial$readmemb("my_rom_data",mem);always@(addrorread_en_)if(!read_en_)read_data=mem[addr];endmodulemy_rom_data000001011100001111010010001111111000100110000001110110
3、1000011101简单的RAM描述RAM描述比ROM略微复杂,因为必须既有读功能又有写功能,而读写通常使用同一数据总线。这要求使用新的处理双向数据线的建模技术。在下面的例子中,若读端口未使能,则模型不驱动数据总线;此时若数据总线没有写数据驱动,则总线为高阻态Z。这避免了RAM写入时的冲突。`timescale1ns/1nsmodulemymem(data,addr,read,write);inout[3:0]data;input[3:0]addr;inputread,write;reg[3:0]memory[
4、0:15];//16*4//读assigndata=read?memory[addr]:4'bz;//写always@(posedgewrite)memory[addr]=data;endmodule这个描述可综合,但许多工具仅仅产生一个寄存器堆,因此与一个真正的存储器相比耗费更多的面积。参数化存储器描述在下面的例子中,给出如何定义一个字长和地址均参数化的只读存储器件。modulescalable_ROM(mem_word,address);parameteraddr_bits=8;//地址总线宽度parame
5、terwordsize=8;//字宽parameterwords=(1<6、明存储器并寻址。reg[wordsize:1]mem[1:words];//从地址1开始的存储器//存储器寻址时地址必须加1wire[wordsize:1]mem_word=mem[address+1];存储器数据装入可以使用循环或系统任务给存储器装入初始化数据用循环给存储器的每个字赋值for(i=0;i7、用系统任务$readmem给一个ROM或RAM加载数据。对于ROM,开始时写入的数据就是其实际内容。对于RAM,可以通过初始化,而不是用不同的写周期给每个字装入数据以减少仿真时间。使用双向端口用关键词inout声明一个双向端口inout[7:0]databus;双向端口声明遵循下列规则:inout端口不能声明为寄存器类型,只能是net类型。这样仿真器若有多个驱动时可以确定结果值。对inout端口可以从任意一个方向驱动数据。端口数据类型缺省为net类型。不能对net进行过程赋值,只能在过程块外部持续赋值,或将它连8、接到基本单元。在同一时间应只从一个方向驱动inout端口。例如:在RAM模型中,如果使用双向数据总线读取RAM数据,同时在数据总线上驱动写数据,则会产生逻辑冲突,使数据总线变为未知。必须设计与inout端口相关的逻辑以确保正确操作。当把该端口作为输入使用时,必须禁止输出逻辑。双向端口建模—使用基本单元建模modulebus_xcvr(bus_a,bus_b,en_a_b,en_b_a)
6、明存储器并寻址。reg[wordsize:1]mem[1:words];//从地址1开始的存储器//存储器寻址时地址必须加1wire[wordsize:1]mem_word=mem[address+1];存储器数据装入可以使用循环或系统任务给存储器装入初始化数据用循环给存储器的每个字赋值for(i=0;i7、用系统任务$readmem给一个ROM或RAM加载数据。对于ROM,开始时写入的数据就是其实际内容。对于RAM,可以通过初始化,而不是用不同的写周期给每个字装入数据以减少仿真时间。使用双向端口用关键词inout声明一个双向端口inout[7:0]databus;双向端口声明遵循下列规则:inout端口不能声明为寄存器类型,只能是net类型。这样仿真器若有多个驱动时可以确定结果值。对inout端口可以从任意一个方向驱动数据。端口数据类型缺省为net类型。不能对net进行过程赋值,只能在过程块外部持续赋值,或将它连8、接到基本单元。在同一时间应只从一个方向驱动inout端口。例如:在RAM模型中,如果使用双向数据总线读取RAM数据,同时在数据总线上驱动写数据,则会产生逻辑冲突,使数据总线变为未知。必须设计与inout端口相关的逻辑以确保正确操作。当把该端口作为输入使用时,必须禁止输出逻辑。双向端口建模—使用基本单元建模modulebus_xcvr(bus_a,bus_b,en_a_b,en_b_a)
7、用系统任务$readmem给一个ROM或RAM加载数据。对于ROM,开始时写入的数据就是其实际内容。对于RAM,可以通过初始化,而不是用不同的写周期给每个字装入数据以减少仿真时间。使用双向端口用关键词inout声明一个双向端口inout[7:0]databus;双向端口声明遵循下列规则:inout端口不能声明为寄存器类型,只能是net类型。这样仿真器若有多个驱动时可以确定结果值。对inout端口可以从任意一个方向驱动数据。端口数据类型缺省为net类型。不能对net进行过程赋值,只能在过程块外部持续赋值,或将它连
8、接到基本单元。在同一时间应只从一个方向驱动inout端口。例如:在RAM模型中,如果使用双向数据总线读取RAM数据,同时在数据总线上驱动写数据,则会产生逻辑冲突,使数据总线变为未知。必须设计与inout端口相关的逻辑以确保正确操作。当把该端口作为输入使用时,必须禁止输出逻辑。双向端口建模—使用基本单元建模modulebus_xcvr(bus_a,bus_b,en_a_b,en_b_a)
此文档下载收益归作者所有