eFlash微架构设计

1.回顾架构设计

2.Flash时序仿真

2.1 ahb_flashc项目目录

  • docs
  • rtl
  • sim
  • tb
  • model

2.2 docs

  • 架构设计文档
  • 微架构设计文档
  • 集成需求文档
  • DataSheet

2.3 model

model文件夹下放的是一些仿真模型(Flash的rtl代码)和一些文档,这里存放的模型是不可综合的,只用于仿真的模型

  • tc -- typical case,典型场景
  • wc -- worse case,较差的场景
  • 不同场景之间,主要影响的是读延迟时间,写和擦除操作的延时时间相差不大
// 查看pdf文件
firefox xxxx.pdf&
  • 配置读取时间的时候,需要按照worse case文档中的时间进行配置。



  • 拿到model之后,可以查看其中的接口信号和参数



2.4 sim

sim路径下存放的是仿真的文件,Makefile等,主要执行的是run_rtl命令、



仿真了三个filelist

  1. model.list

  2. rtl.list

  3. tb.list

2.5 tb

在拿到Flash之后,可以搭建tb进行一些读写擦操作,更加深入的理解Flash的时序。


// flash_tb `timescale 1ns/10ps module flash_tb; reg [9:0] XADR;
reg [4:0] YADR;
reg [31:0] DIN;
reg XE;
reg YE;
reg SE;
reg ERASE;
reg MAS1;
reg PROG;
reg NVSTR; wire [31:0] DOUT;
reg [31:0] rdata; initial begin
$vcdpluson();
end initial begin // 先将信号初始化
XADR = 10'b0;
YADR = 5'b0;
DIN = 32'b0;
XE = 1'b0;
YE = 2'b0;
SE = 1'b0;
ERASE = 1'b0;
MAS1 = 1'b0;
PROG = 1'b0;
NVSTR = 1'b0; // 延迟100个时间单位
#100; // 调用任务
page_erase(8'b0);
prog_word(10'h0,5'h0,32'h12345678);
read_word(10'h0,rdata);
// prog_word(10'b0,5'h0,32'haabbccdd);
// read_word(10'h0,5'h1,rdata); // 延迟100个时间单位
#100; // 结束仿真
$finish;
end // 例化flash
// .表示rtl中的变量,()表示输入给rtl的变量,也就是在tb中定义的变量 SFD32KX32M32P4C_HE_LMC U_flash(
.XADR (XADR ),
.YADR (YADR ),
.DIN (DIN ),
.XE (XE ),
.YE (YE ),
.SE (SE ),
.ERASE (ERASE ),
.MAS1 (MAS1 ),
.PROG (PROG ),
.NVSTR (NVSTR ),
.IFREN (1'b0 ),
.TMR (1'b1 ),
.VPP () ,
.TM ()
); task page_erase(input [7:0] page_num);
begin
#1234;
XADR = {page_num,2'b0}; // 1024行,256页,页数8位,再补两bit
XE = 1'b1;
ERASE = 1'b1;
#5000;
NVSTR = 1'b1;
#20000000;
ERASE = 1'b0;
#5000;
XE = 1'b0;
NVSTR = 1'b0;
#10000
end
endtask task prog_word(input [9:0] xadr,input [4:0] yadr,input [31:0] wdata);
begin
#1234;
XADR = xadr;
YADR = yadr;
XE = 1'b1;
PROG = 1'b1;
#5000;
NVSTR = 1'b1;
#10000;
YE = 1'b1;
#20000;
YE = 1'b0;
#20;
PROG = 1'b0;
#5000;
XE = 1'b0;
NVSTR = 1'b0;
#10000; end
endtask task read_word(input [9:0] xadr,input [4:0] yadr,output [31:0] rdata);
begin
#1234;
XADR = xadr;
YADR = yadr;
XE = 1'b1;
YE = 1'b1;
SE = 1'b1;
#50;
rdata = DOUT;
XE = 1'b0;
YE = 1'b0;
SE = 1'b0;
end
endtask endmodule

3.微架构呀设计思路

主要在架构设计文档的基础上进行信号补全

3.1 AHB_slave_if信号扩展

  • 首选将AHB的两个phaze进行对齐
  • 三种寄存器:配置寄存器,中断使能寄存器,状态寄存器需要明确
// 1.config寄存器

// 时间配置
// 写时间配置寄存器,可以根据读写擦时序图进行书写
1. read_access time
2. nvstore setup // 擦除操作的NVSore可以和prog共用,因为不能同时进行erase和prog
3. nvstore hold // 后面prog就没有必要再设置一套nvstore寄存器了
4. erase time
5. mass erase time
6. recover time 7. program setup time
8. program holdup time
9. program time 10. addr setup time
11. addr hold time // 对于读操作,AHB总线会发送过来读地址,所以直接使用AHB总线发的地址进行读取
// 对于擦除操作,需要确定是哪一个page,所以要配置page num
12. page num
13. erase information or main block // 需要判断擦除的是Flash中的哪一部分
14. erase mass/page // 表示擦除mass还是page之后 // 确定上述信号之后,可以通知Flash_ctrl模块进行操作
15. erase_en // 对于program操作
16. program wdata //配置写数据
17. program addr // 配置写地址
18. program information/main // 配置写Flash中的哪一块 // 配置完前面的寄存器之后,可以发送信号给Flash_ctrl进行操作
19.program_en
// 2. 配置状态寄存器,表示当前操作的状态,读完,写完....
1. prog_finish // 写完
2. erase_finish // 擦完,这个寄存器可以和上prog_finish共用
3. read_finish
4. boot_pe_error // boot期间出现了写操作的错误
// 3.中断使能寄存器
1.int_en

3.2 Flash_ctrl

Flash_ctrl接收的是寄存器的配置,描述状态机

* 方式一:针对于每一种操作,写一种状态机,相应信号来了之后就开启相应操作的状态机

* 方式二:可以将对于所有操作的状态机都集成到一个状态机中

3.2.1 prog状态机

  1. 初始的时候是IDLE
  2. 接收到写操作信号(prog_en)的时候,进入Tnvs状态,在这之前关于写操作的寄存器都要配置完成,在这个状态中设置一个计数器,如果计满当前的状态,就进入下一个状态,没有计满时间就在当前状态进行循环
  3. 在Tnvs之后,进入Tpgs(从NVSTR拉高到YE拉高)
  4. Tpgs之后进入Tads(地址准备好到YE拉高)
  5. Tprog
  6. Tadh
  7. Tpgh
  8. Tnvh
  9. Trcv
  10. 转到IDLE

3.2.2 erase状态机

合并状态机

  • 红色状态表示两个状态机中所共有的状态,可以将红色状态进行合并



3.2.3 read状态机合并

read时序简单,只需要等待几个cycle进行返回读数据

3.2.4 Flash_ctrl内部信号设计

要对Flash_ctrl进行考虑DFT mode下,需要将两块Flash信号bypass

  1. 正常工作模式下,状态机分别向两块Flash发出控制信号,Flash0和Flash1都需要返回rdata
  2. DFT的时候Flash0和Flash1相当于是黑盒子,控制比较复杂,DFT是做扫描链测试,不断打入激励,扫描出结果
  3. DFT模式下, 引入一个异或逻辑,将状态机将要输出的逻辑转到异或逻辑中
  4. 通过一个mux,在dft使能(dft_en)的条件下,选择输出;dft_en拉高,表示当前是dft模式,就将Flash0和Flash1跳过,输出dft测试的结果;dft_en拉低表示当前是正常工作模式,将Flash0或者Flash1的输出作为输出的rdata



4.总结

  • 微架构设计文档的输入是架构设计文档
  • 分各个模块进行信号分析,细化AHB_slave_if中的信号和寄存器,绘制Flash_ctrl中的状态机
  • 考虑DFT mode的测试路径

5.微架构设计文档

5.1 eFlash控制器模块框图

5.2 AHB_slave接口

5.3 信号功能说明表















  • 一个地址对应一个byte,256kbyte需要18bit地址,上面表格中的地址位数是错误的
  • eflash_wp_n -- 擦写flash的外部保护信号,在进行基台测试的时候,已经将程序烧录到flash中了,这些程序是不希望被修改的,所以要这个信号进行控制对flash的擦写
  • boot_en -- 表示当前处于初始化状态,整个系统初始化,在初始化的时候需要保护boot区间,在boot区间之内,不能进行擦除和写的操作
  • CPU过来的地址需要加一个偏移量offset,偏移到boot程序存放的地址?一般而言,boot区间通常分配在eflash比较后面的地址,不在eflash初始的位置;CPU在上电之后,CPU需要通过I-cache访问存储器,第一种情况,从存储器的0地址开始进行访问,初始的访问地址是0,如果此时boot区间不是0地址,所以在操作的时候,将boot区间做一个偏移,偏移到0地址;eflash根据是不是处于boot状态,如果处于boot状态,就将CPU发送过来的地址加一个offset(haddr+offset),否则就使用haddr;第二种情况,CPU中存在寄存器,CPU刚上电之后,寄存器的复位值就是boot区间的起始地址(start_addr),CPU在上电复位之后,可以直接拿start_addr进行寻址,不用将地址offset
  • addr_offset--不是以byte为单位的,addr_offset通常都是1k,2k,,,,整数倍

  • flash_busy -- 表示当前进行写擦操作
  • flash_wr_done/flash_pe_done -- 表示擦写完成
  • hready_flag -- 表示读操作的时候需要总线延迟
  • flash_rdata -- 两块flash经过片选之后得到哪一块flash输出数据
  • hready_resp -- 返回给AHB总线的数据,
  • hresp -- AHB总线状态(okay,error,retry,split),如果没有error的状态就将其设置为1
  • flash_pe_en -- 在配置好相关的寄存器之后,就可以产生擦除使能,可以是脉冲,也可以是电平
  • rd_infr0_sel -- 表示读infr0 area片选信号,这几个片选信号使用的是独热码,最多只有1bit有效

基于AHB_BUS的eFlash控制器的微架构设计的更多相关文章

  1. 【原创】基于Docker的CaaS容器云平台架构设计及市场分析

    基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交 ...

  2. 基于token的多平台身份认证架构设计

    基于token的多平台身份认证架构设计 1   概述 在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情. 随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格 ...

  3. 手机服务器微架构设计与实现 之 http server

    手机服务器微架构设计与实现 之 http server ·应用 ·传输协议和应用层协议概念 TCP  UDP  TCP和UDP选择 三次握手(客户端与服务器端建立连接)/四次挥手(断开连接)过程图 · ...

  4. 基于Vue3+TS的Monorepo前端项目架构设计与实现

    写在前面 你好,我是前端程序员鼓励师岩家兴!去年在另一个项目https://juejin.cn/post/7121736546000044046中,我向读者朋友们介绍了结合npm包管理工具yarn作v ...

  5. 基于Java的数字货币交易系统的架构设计与开发

    前言 无论是股票交易系统,还是数字货币交易系统,都离不开撮合交易引擎,这是交易平台的心脏.同时,一个优秀的架构设计也会让交易平台的运维和持续开发更加容易.本文基于对开源项目的深入研究,总结了数字货币交 ...

  6. 【CPU微架构设计】利用Verilog设计基于饱和计数器和BTB的分支预测器

    在基于流水线(pipeline)的微处理器中,分支预测单元(Branch Predictor Unit)是一个重要的功能部件,它负责收集和分析分支/跳转指令的执行结果,当处理后续分支/跳转指令时,BP ...

  7. WebApi 基于token的多平台身份认证架构设计

    1   概述 在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情. 随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格局 . 不同的客户端产生了不同的用户使用 ...

  8. 【CPU微架构设计】分布式多端口(4写2读)寄存器堆设计

    寄存器堆(Register File)是微处理的关键部件之一.寄存器堆往往具有多个读写端口,其中写端口往往与多个处理单元相对应.传统的方法是使用集中式寄存器堆,即一个集中式寄存器堆匹配N个处理单元.随 ...

  9. 瓜子IM智能客服系统的数据架构设计(整理自现场演讲)

    本文由ITPub根据封宇在[第十届中国系统架构师大会(SACC2018)]现场演讲内容整理而成. 1.引言 瓜子业务重线下,用户网上看车.预约到店.成交等许多环节都发生在线下.瓜子IM智能客服系统的目 ...

  10. 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程 ...

随机推荐

  1. 浅谈JSP中forward和redirect

    redirect 重定向,完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接 forward 转向,浏览器中不会显示后面的网址;如果你需要在下一个页面中能从中获取新的信息的话,你可以Reques ...

  2. 若依集成mybatisplus实现mybatis增强

  3. MinIO客户端之tree

    MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc tree 使用树的形式,输出桶内的目录和文件. ./mc tree --files local1/bkt1 ...

  4. shell的变量

    变量含义 学生时代所学的数学方程式,如x=1,y=2,那会称之为x,y是未知数 对于计算机角度,x=1,y=2等于定义了两个变量,名字分别是x,y,且赋值了1和2 变量是暂时存储数据的地方,变量临时存 ...

  5. JavaFx之SceneBuilder添加其他依赖库(十六)

    JavaFx之SceneBuilder添加其他依赖库(十六) Could not open 'xxxxx.jar' Open operation has failed. Make sure that ...

  6. ubuntu 之 go+/goplus 安装

    目前情况是要安装 goplus/go+ 之前 必须先安装 golang golang下载地址:https://golang.google.cn/dl/ 或者 https://studygolang.c ...

  7. Blazor技术入门

    曾写过点儿前后端分离的项目(Vue+.NET Core Web API).WPF和WinForm.因为Blazor不支持小程序的原因(相对于uniapp),所以只是大概知道Blazor可以写Web.P ...

  8. Kuasar成为CNCF官方项目,探索容器运行时新纪元

    本文分享自华为云社区<Kuasar成为CNCF官方项目,探索容器运行时新纪元!>,作者:云容器大未来. 北京时间12月20日,云原生计算基金会(CNCF)正式接纳多沙箱容器运行时项目 Ku ...

  9. 这场世界级的攻坚考验,华为云GaussDB稳过

    摘要:实践证明,华为云GaussDB完全经受住了这场世界级的攻坚考验,也完全具备支撑大型一体机系统迁移上云的能力,并积累了丰富的经验. 本文分享自华为云社区<这场世界级的攻坚考验,华为云Gaus ...

  10. JDk 与 ADB 环境变量配置

    ### Java环境变量配置 首先,JDK是整个Java的核心,包括了Java运行环境,一推Java工具和Java基础的类库. 网址:https://www.oracle.com/technetwor ...