Verilog RAM/ROM的数据初始化

简介: Verilog RAM/ROM的数据初始化



FPGA设计中RAM和ROM作为存储器用来存储可变或不可变类型的数据。

ROM初始化一般是加载固定数据,RAM声明时默认为不定态数据,初始化时可以让数据为全1或者全0。

一、初始化方式

  1. 复位时按地址写入初值
always@ (posedge clk_in or negedge rst_n_in ) begin
    if( !rst_n_in ) begin
        ram_reg[0] <= xxx;
        ram_reg[1] <= xxx;
        ...
        ram_reg[n-1] <= xxx;
    end else begin
        ...
    end
end
  1. 使用initial 和 for循环来初始化
    用于初始化为有规律的数据,RAM初始化常使用这种方式。
initial begin : ram_init
    integer i;
    for(i=0;i<n;i++) begin
        ram_reg[i] = xxx;
    end
end
  1. 变量的定义必须在命名块中,因此这里需要使用命名的initial块。
  2. 通过读文件的方式初始化
    将数据存储在.dat文件中,通过读文件实现初始化。
    这种方式RAM使用较少,一般ROM初始化时喜欢采用这种做法。
initial begin
    $readmemh("filepath",rom_reg);
end

二、测试

方式1的正确性不言而喻。

方式2和方式3中,initial块一般来说是用在仿真中的,对其能否综合,编写如下的测试代码:

  1. 定义了两块寄存器,用来实现RAM
  2. ram_1通过方式2初始化
  3. ram_2通过方式3初始化,dat文件内容从0x0f ~ 0x08

  4. 循环对ram中的内容进行读取
  5. 调用ila核,来抓取读取的数据
`timescale 1ns / 1ps
//
// Engineer: wkk 
// Create Date: 2023/12/23 20:50:45
// Module Name: init_value_test
//
module init_value_test(
    input   clk_in    ,
    input   rst_n_in  ,
    
    output  nc_out 
);
reg [7:0]  ram_1 [7:0];
reg [7:0]  ram_2 [7:0];
reg  [2:0]  ram_addr ;
wire [7:0]  ram_1_out;
wire [7:0]  ram_2_out;
initial begin : init_ram1
    integer i;
    for( i=0;i<7;i = i+1 ) begin
        ram_1[i] = i+1;
    end
end
initial begin : init_ram2
    $readmemh("E:/FPGA/init_value_test/init_value_test.srcs/data/ram_data.dat",ram_2);
end
always @( posedge clk_in or negedge rst_n_in ) begin
    if( !rst_n_in ) begin
        ram_addr <= 'b0;
    end else begin
        ram_addr <= ram_addr + 1'b1;
    end
end
assign ram_1_out = ram_1[ram_addr];
assign ram_2_out = ram_2[ram_addr];
ila_0 ila_0_inst (
        .clk(clk_in), // input wire clk
        .probe0(ram_1_out), // input wire [7:0]  probe0  
        .probe1(ram_2_out), // input wire [7:0]  probe1 
        .probe2(ram_addr)   // input wire [2:0]  probe2
);
endmodule

增加了一个nc_out 端口,实际上是没有什么作用的,但是必须要加,否则会报错:

[Place 30-494] The design is empty
Resolution: Check if opt_design has removed all the leaf cells of your design.  Check whether you have instantiated and connected all of the top level ports.

原因:顶层文件没有输出接口

测试结果

通过ila核抓出的数据,表明方式2和方式3成功的实现了初始化操作。

相关文章
|
1月前
|
存储 缓存 固态存储
详解电子设备RAM和ROM
详解电子设备RAM和ROM
43 0
|
4月前
|
存储 缓存 算法
RAM与ROM的区别及应用
RAM与ROM的区别及应用
|
6月前
|
存储 芯片 内存技术
ROM和RAM的工作原理(DRAM和DROM)以及DRAM的刷新方法
ROM和RAM的工作原理(DRAM和DROM)以及DRAM的刷新方法
612 2
|
6月前
|
存储 芯片 内存技术
(嵌入式常识)-rom,flash和ram的区别
我老是将MCU中常见的存储设备搞混,故记录于此
|
存储 算法 计算机视觉
m基于FPGA的各类存储器纯Verilog实现,包含testbench,包括RAM,SRAM等
m基于FPGA的各类存储器纯Verilog实现,包含testbench,包括RAM,SRAM等
398 2
|
存储 编译器 C语言
RAM明明断电会丢失数据,为什么初始化的全局变量存储在RAM?详细分析程序的存储
RAM明明断电会丢失数据,为什么初始化的全局变量存储在RAM?详细分析程序的存储
562 0
|
存储 缓存 算法
内存、ram、 rom、 norflash,nandflash详细区别
内存、ram、 rom、 norflash,nandflash详细区别
1870 1
|
存储 数据采集 运维
阿里云RAM账号配置SLS数据加工最佳实践
数据加工服务是阿里云SLS推出的面向日志ETL处理的服务,主要解决数据加工过程中转换、过滤、分发、富化等场景。使用数据加工功能时,将涉及数据读写权限以及数据加工操作权限的授予问题。本文档主要介绍:1. 使用主账号为RAM用户授权以使其具有浏览Logstore数据的权限并能够创建和修改数据加工作业;2. 在不同工作场景下使用RAM账号创建或修改数据加工的最佳实践方法。
|
机器学习/深度学习 分布式计算 Cloud Native
PAI Designer RAM用户如何绑定单独Bucket对OSS数据访问
机器学习平台PAI(Platform of Artificial Intelligence)是面向企业客户及开发者,提供轻量化、高性价比的云原生机器学习。是构建在阿里云MaxCompute(原ODPS)计算平台之上,集数据处理、建模、离线预测、在线预测为一体的机器学习平台。使用Designer进行建模时,需授予操作账号使用Designer功能所需的操作权限,同时需要授予PAI访问相关云产品的权限,以保障功能安全顺利地使用。在授权操作账号对OSS的操作权限时,支持通过自定义策略灵活定义RAM用户在PAI控制台中对OSS数据的访问权限。本文将使用主账号简单演示对RAM用户授予访问OSS数据的权限。
407 0
PAI Designer RAM用户如何绑定单独Bucket对OSS数据访问