异步FIFO设计的仿真与综合技术(6)

概述

        本文主体翻译自C. E. Cummings and S. Design, “Simulation and Synthesis Techniques for Asynchronous FIFO Design 一文,添加了笔者的个人理解与注释,文中蓝色部分为笔者注或意译。前文链接:

异步FIFO设计的仿真与综合技术(5)icon-default.png?t=N7T8https://blog.csdn.net/apple_53311083/article/details/132974327?spm=1001.2014.3001.5501

6.0 FIFO设计的RTL代码(RTL code for FIFO Style #1)

        本节中列出了FIFO样式#1模型的Verilog RTL代码。

6.1 fifo1.v - FIFO top-level module

顶层的FIFO模块是一个参数化的FIFO设计,所有的子块都使用推荐的执行命名端口连接的方式进行实例化。另一种常见的编码方式是为顶层模块实例化提供与模块名称相同的名称。这样做是为了方便调试,因为如果实例名称与模块名称匹配,那么在层次路径中引用模块名称将是直接的。

 

module fifo1 #(parameter DSIZE = 8,parameter ASIZE = 4)(output [DSIZE-1:0] rdata,output wfull,output rempty,input [DSIZE-1:0] wdata,input winc, wclk, wrst_n,input rinc, rclk, rrst_n);wire [ASIZE-1:0] waddr, raddr;wire [ASIZE:0] wptr, rptr, wq2_rptr, rq2_wptr;sync_r2w sync_r2w (.wq2_rptr(wq2_rptr), .rptr(rptr),.wclk(wclk), .wrst_n(wrst_n));sync_w2r sync_w2r (.rq2_wptr(rq2_wptr), .wptr(wptr),.rclk(rclk), .rrst_n(rrst_n));fifomem #(DSIZE, ASIZE) fifomem(.rdata(rdata), .wdata(wdata),.waddr(waddr), .raddr(raddr),.wclken(winc), .wfull(wfull),.wclk(wclk));rptr_empty #(ASIZE) rptr_empty(.rempty(rempty),.raddr(raddr),.rptr(rptr), .rq2_wptr(rq2_wptr),.rinc(rinc), .rclk(rclk),.rrst_n(rrst_n));wptr_full #(ASIZE) wptr_full(.wfull(wfull), .waddr(waddr),.wptr(wptr), .wq2_rptr(wq2_rptr),.winc(winc), .wclk(wclk),.wrst_n(wrst_n));endmodule

6.2 fifomem.v - FIFO memory buffer

        FIFO存储器缓冲区通常是一个实例化的ASIC或FPGA双端口,同步存储器设备。内存缓冲区也可以使用这个模块中的RTL代码合成到ASIC或FPGA寄存器。关于实例化的供应商RAM与verilog声明的RAM,同步系统设计团队进行了内部分析,发现对于高达256位的大小,与实例化的供应商RAM相比,使用verilog声明的RAM不会损失区域或性能。如果已实例化了供应商RAM,则强烈建议使用已命名的端口连接进行实例化。

module fifomem #(parameter DATASIZE = 8, // Memory data word widthparameter ADDRSIZE = 4) // Number of mem address bits(output [DATASIZE-1:0] rdata,input [DATASIZE-1:0] wdata,input [ADDRSIZE-1:0] waddr, raddr,input wclken, wfull, wclk);`ifdef VENDORRAM// instantiation of a vendor's dual-port RAMvendor_ram mem (.dout(rdata), .din(wdata),.waddr(waddr), .raddr(raddr),.wclken(wclken),.wclken_n(wfull), .clk(wclk));`else// RTL Verilog memory modellocalparam DEPTH = 1<<ADDRSIZE;reg [DATASIZE-1:0] mem [0:DEPTH-1];assign rdata = mem[raddr];always @(posedge wclk)if (wclken && !wfull) mem[waddr] <= wdata;`endif
endmodule

6.3 sync_r2w.v - Read-domain to write-domain synchronizer

这是一个简单的同步器模块,用于通过由FIFO写入时钟时钟的一对寄存器,将n位指针从读取时钟域传递到写入时钟域。请注意,将两个寄存器连接在一起以进行重置和移位的总是块的简单性。同步器always块只有三行代码。所有模块输出都被注册为使用时间预算进行简化合成。该模块的所有输出都与wclk完全同步,而该模块的所有异步输入都来自rclk域,所有信号都使用“r”前缀命名,这使得很容易在所有“r*”信号上设置错误路径,以便简化静态定时分析。
module sync_r2w #(parameter ADDRSIZE = 4)(output reg [ADDRSIZE:0] wq2_rptr,input [ADDRSIZE:0] rptr,input wclk, wrst_n);reg [ADDRSIZE:0] wq1_rptr;always @(posedge wclk or negedge wrst_n)if (!wrst_n) {wq2_rptr,wq1_rptr} <= 0;else {wq2_rptr,wq1_rptr} <= {wq1_rptr,rptr};
endmodule

6.4 sync_w2r.v - Write-domain to read-domain synchronizer

这是一个简单的同步器模块,用于通过FIFO读时钟时钟的一对寄存器,从写时钟域传递到读时钟域。请注意将两个寄存器连接在一起以进行重置和移动的总是块的简单性。同步器always块只有三行代码。所有模块输出都被注册为使用时间预算进行简化合成。该模块的所有输出都与rclk完全同步,而该模块的所有异步输入都来自wclk域,所有信号都使用“w”前缀命名,这使得很容易在所有“w*”信号上设置错误路径,以便简化静态定时分析。
module sync_w2r #(parameter ADDRSIZE = 4)(output reg [ADDRSIZE:0] rq2_wptr,input [ADDRSIZE:0] wptr,input rclk, rrst_n);reg [ADDRSIZE:0] rq1_wptr;always @(posedge rclk or negedge rrst_n)if (!rrst_n) {rq2_wptr,rq1_wptr} <= 0;else {rq2_wptr,rq1_wptr} <= {rq1_wptr,wptr};
endmodule

6.5 rptr_empty.v - Read pointer & empty generation logic

此模块包含在读取时钟域内生成的所有FIFO逻辑(同步器除外)。读取指针是一个双n位格雷码计数器。n位指针(rptr)通过sync_r2w模块传递到写时钟域。(n-1)位指针(raddr)用于寻址FIFO缓冲区。当下一个rptr值等于同步的wptr值时,注册FIFO空输出并在下一个上升沿生效。所有模块输出都被注册为使用时间预算进行简化合成。这个模块与rclk完全同步,以简化静态定时分析。
module rptr_empty #(parameter ADDRSIZE = 4)(output reg rempty,output [ADDRSIZE-1:0] raddr,output reg [ADDRSIZE :0] rptr,input [ADDRSIZE :0] rq2_wptr,input rinc, rclk, rrst_n);reg [ADDRSIZE:0] rbin;wire [ADDRSIZE:0] rgraynext, rbinnext;//-------------------// GRAYSTYLE2 pointer//-------------------always @(posedge rclk or negedge rrst_n)if (!rrst_n) {rbin, rptr} <= 0;else {rbin, rptr} <= {rbinnext, rgraynext};// Memory read-address pointer (okay to use binary to address memory)assign raddr = rbin[ADDRSIZE-1:0];assign rbinnext = rbin + (rinc & ~rempty);assign rgraynext = (rbinnext>>1) ^ rbinnext;//---------------------------------------------------------------// FIFO empty when the next rptr == synchronized wptr or on reset//---------------------------------------------------------------assign rempty_val = (rgraynext == rq2_wptr);always @(posedge rclk or negedge rrst_n)if (!rrst_n) rempty <= 1'b1;else rempty <= rempty_val;
endmodule

6.6 wptr_full.v - Write pointer & full generation logic

此模块包含在写入时钟域内生成的所有FIFO逻辑(同步器除外)。写指针是一个双n位格雷码计数器。n位指针(wptr)通过sync_w2r模块传递到读取时钟域。(n-1)位指针(waddr)用于处理FIFO缓冲区。当下一个修改的wgnext值等于同步和修改的wrptr2值(MSBs除外)时,注册FIFO完整输出并在下一个wclk上升沿生效。所有模块输出都被注册为使用时间预算进行简化合成。该模块与wclk完全同步,以简化静态定时分析。
module wptr_full #(parameter ADDRSIZE = 4)(output reg wfull,output [ADDRSIZE-1:0] waddr,output reg [ADDRSIZE :0] wptr,input [ADDRSIZE :0] wq2_rptr,input winc, wclk, wrst_n);reg [ADDRSIZE:0] wbin;wire [ADDRSIZE:0] wgraynext, wbinnext;// GRAYSTYLE2 pointeralways @(posedge wclk or negedge wrst_n)if (!wrst_n) {wbin, wptr} <= 0;else {wbin, wptr} <= {wbinnext, wgraynext};// Memory write-address pointer (okay to use binary to address memory)assign waddr = wbin[ADDRSIZE-1:0];assign wbinnext = wbin + (winc & ~wfull);assign wgraynext = (wbinnext>>1) ^ wbinnext;//------------------------------------------------------------------// Simplified version of the three necessary full-tests:// assign wfull_val=((wgnext[ADDRSIZE] !=wq2_rptr[ADDRSIZE] ) &&// (wgnext[ADDRSIZE-1] !=wq2_rptr[ADDRSIZE-1]) &&// (wgnext[ADDRSIZE-2:0]==wq2_rptr[ADDRSIZE-2:0]));//------------------------------------------------------------------assign wfull_val = (wgraynext=={~wq2_rptr[ADDRSIZE:ADDRSIZE-1],wq2_rptr[ADDRSIZE-2:0]});always @(posedge wclk or negedge wrst_n)if (!wrst_n) wfull <= 1'b0;else wfull <= wfull_val;
endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/112699.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天选之子C++是如何发展起来的?如何学习C++呢?

天选之子C是如何发展起来的&#xff1f;如何学习C呢? 一、什么是C二、C发展史三、C的重要性3.1 语言的使用广泛度3.2 在工作领域 四、如何学习C4.1 大佬怎么学&#xff1f;4.2 自己怎么学 一、什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复…

docker-compose使用

docker-compose docker的项目编排 一、安装docker-compose Rocky Linux Rocky Linux安装Docker Compose的步骤如下&#xff1a; 安装Docker。您可以使用以下命令安装Docker&#xff1a; sudo dnf install docker-ce docker-ce-cli containerd.io安装Docker Compose。您可以…

这些提高摸鱼效率的自动化测试技巧,提高打工人幸福感~

最近有许多小伙伴都在吐槽打工好难。 每天都是执行许多重复的任务 例如阅读新闻、发邮件、查看天气、打开书签、清理文件夹等等&#xff0c; 使用自动化脚本&#xff0c;就无需手动一次又一次地完成这些任务&#xff0c; 非常方便啊有木有&#xff1f;&#xff01; 今天就…

idea打开项目时不小心点了attach,如何恢复?

右击映射的项目&#xff0c;选择Remove from Project View即可。

网络分层模型和常见协议介绍

文章目录 网络分层模型和常见协议介绍网络分层模型介绍常见各层协议介绍 网络分层模型和常见协议介绍 理解性记忆&#xff1a;这是我自己创造的一个理解性记忆口诀&#xff0c;大家别笑我&#x1f604; 七层&#xff1a;因为七层协议并没有得到应用&#xff0c;所以物&#xff…

可以实时监控电脑的软件有哪些?

在当今的数字化世界中&#xff0c;计算机已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;随着计算机使用的普及&#xff0c;安全问题也日益突出。为了保护我们的计算机和数据&#xff0c;实时监控电脑的使用情况变得越来越重要。本文将为您介绍一些实时监控电脑的…

【深度学习】 Python 和 NumPy 系列教程(十三):Matplotlib详解:1、2d绘图(上):折线图、散点图、柱状图、直方图、饼图

目录 一、前言 二、实验环境 三、Matplotlib详解 0、绘图风格 1、2d绘图类型 0. 设置中文字体 1. 折线图&#xff08;Line Plot&#xff09; 2. 散点图&#xff08;Scatter Plot&#xff09; 3. 柱状图&#xff08;Bar Plot&#xff09; 4. 直方图&#xff08;Histogr…

第二证券:迎政策利好,工业母机概念拉升,华东数控等涨停

工业母机概念19日盘中发力拉升&#xff0c;到发稿&#xff0c;博亚精工涨超11%&#xff0c;华东重机、华东数控涨停&#xff0c;华辰配备、华中数控涨超4%。 音讯面上&#xff0c;近来&#xff0c;财政部、税务总局、国家发改委、工信部发布《关于前进集成电路和工业母机企业研…

按月统计数据——mysql实现

业务场景 对某类业务数据&#xff0c;按月统计数量&#xff0c;返回当年各个月份的任务数量。 思路 按照创建时间&#xff0c;格式化为yyyy-mm的month字段&#xff0c;然后根据month进行分组查询&#xff0c;统计count作为数量 SELECT DATE_FORMAT(create_time, %Y-%m) AS mon…

Mac 安装软件各种报错解决方案

Mac 安装软件各种报错解决方案 文章目录 Mac 安装软件各种报错解决方案一. 打开允许“允许任何来源”二. 无法打开"xxx"&#xff0c;因为它不是从App Store下载三. 无法打开"xxx"&#xff0c;因为 Apple无法检查其是否包含恶意软件。四. "xxx"已…

央媒发稿不能改?媒体发布新闻稿有哪些注意点

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 “央媒发稿不能改”是媒体行业和新闻传播领域的普遍理解。央媒&#xff0c;即中央主要媒体&#xff0c;是权威性的新闻源&#xff0c;当这些媒体发布新闻稿或报道时&#xff0c;其他省、…

【JavaEE】多线程案例-单例模式

文章目录 1. 前言2. 什么是单例模式3. 如何实现单例模式3.1 饿汉模式3.2 懒汉模式4. 解决单例模式中遇到的线程安全问题4.1 加锁4.2 加上一个判断解决频繁加锁问题4.2 解决因指令重排序造成的线程不安全问题 1. 前言 单例模式是我们面试中最常考到的设计模式。什么是设计模式呢…