E203 bypass buffer
如果fifo中没有数据,且有输入,则是bypass fifo,同周期内直接把输入数据转到输出数据。如果fifo中有数据,则读取fifo,成为普通的同步fifo。
- module sirv_gnrl_bypbuf # (
- parameter DP = 8,
- parameter DW = 32
- ) (
- input i_vld,
- output i_rdy,
- input [DW-1:0] i_dat,
- output o_vld,
- input o_rdy,
- output [DW-1:0] o_dat,
- input clk,
- input rst_n
- );
- wire fifo_i_vld;
- wire fifo_i_rdy;
- wire [DW-1:0] fifo_i_dat;
- wire fifo_o_vld;
- wire fifo_o_rdy;
- wire [DW-1:0] fifo_o_dat;
- sirv_gnrl_fifo # (
- .DP(DP),
- .DW(DW),
- .CUT_READY(1)
- ) u_bypbuf_fifo(
- .i_vld (fifo_i_vld),
- .i_rdy (fifo_i_rdy),
- .i_dat (fifo_i_dat),
- .o_vld (fifo_o_vld),
- .o_rdy (fifo_o_rdy),
- .o_dat (fifo_o_dat),
- .clk (clk ),
- .rst_n (rst_n)
- );
- // This module is a super-weapon for timing fix,
- // but it is tricky, think it harder when you are reading, or contact Bob Hu
- assign i_rdy = fifo_i_rdy;
- // The FIFO is bypassed when:
- // * fifo is empty, and o_rdy is high
- wire byp = i_vld & o_rdy & (~fifo_o_vld);
- // FIFO o-ready just use the o_rdy
- assign fifo_o_rdy = o_rdy;
- // The output is valid if FIFO or input have valid
- assign o_vld = fifo_o_vld | i_vld;
- // The output data select the FIFO as high priority
- assign o_dat = fifo_o_vld ? fifo_o_dat : i_dat;
- assign fifo_i_dat = i_dat;
- // Only pass to FIFO i-valid if FIFO is not bypassed
- assign fifo_i_vld = i_vld & (~byp);
- endmodule
- module sirv_gnrl_dffs_tb;
- reg clk=0,rst_n;
- reg i_vld, o_rdy;
- reg [31:0] i_dat;
- wire i_rdy, o_vld;
- wire [31:0] o_dat;
- sirv_gnrl_bypbuf #(.CUT_READY(1),.DP(4),.DW(32)) mybuf(.i_vld(i_vld),.i_rdy(i_rdy),.i_dat(i_dat),.o_vld(o_vld),.o_rdy(o_rdy),.o_dat(o_dat),.clk(clk),.rst_n(rst_n));
- always #10 clk=~clk;
- initial
- begin
- rst_n=1'b1;
- i_vld = 1'b0;
- o_rdy = 1'b0;
- i_dat = 32'h12345678;
- #20
- rst_n=1'b0;
- #80
- rst_n=1'b1;
- #80
- i_vld = 1'b1;
- o_rdy = 1'b1;
- i_dat = 32'h8;
- #20
- i_vld = 1'b1;
- o_rdy = 1'b1;
- i_dat = 32'h12;
- #20
- i_vld = 1'b1;
- o_rdy = 1'b1;
- i_dat = 32'h2;
- #20
- i_vld = 1'b1;
- o_rdy = 1'b1;
- i_dat = 32'h11;
- #20
- i_vld = 1'b1;
- o_rdy = 1'b1;
- i_dat = 32'h13;
- #20
- i_vld = 1'b1;
- o_rdy = 1'b1;
- i_dat = 32'h6;
- #20
- i_vld = 1'b1;
- o_rdy = 1'b1;
- i_dat = 32'h22;
- #20
- i_vld = 1'b1;
- o_rdy = 1'b1;
- i_dat = 32'h99;
- #20
- i_vld = 1'b1;
- o_rdy = 1'b1;
- i_dat = 32'h33;
- #20
- i_vld = 1'b0;
- o_rdy = 1'b1;
- i_dat = 32'h17;
- #20
- i_vld = 1'b1;
- o_rdy = 1'b1;
- i_dat = 32'h3;
- #500 $finish;
- end
- initial
- $monitor($time,,,"clk=%b,rst_n=%b,i_vld=%b,o_rdy=%b, i_rdy=%b, o_vld=%b,",clk,rst_n,i_vld,o_rdy,i_rdy,o_vld);
- initial
- begin
- //$dumpfile("dump.vcd");
- //$dumpvars;
- $fsdbDumpfile("dump.fsdb");
- $fsdbDumpvars("+all");
- end
- endmodule
用上面的testbench,可以看到是bypass buffer,fifo_o_vld总为0


- module sirv_gnrl_dffs_tb;
- reg clk=0,rst_n;
- reg i_vld, o_rdy;
- reg [31:0] i_dat;
- wire i_rdy, o_vld;
- wire [31:0] o_dat;
- sirv_gnrl_bypbuf #(.CUT_READY(1),.DP(4),.DW(32)) mybuf(.i_vld(i_vld),.i_rdy(i_rdy),.i_dat(i_dat),.o_vld(o_vld),.o_rdy(o_rdy),.o_dat(o_dat),.clk(clk),.rst_n(rst_n));
- always #10 clk=~clk;
- initial
- begin
- rst_n=1'b1;
- i_vld = 1'b0;
- o_rdy = 1'b0;
- i_dat = 32'h12345678;
- #20
- rst_n=1'b0;
- #80
- rst_n=1'b1;
- #80
- i_vld = 1'b1;
- o_rdy = 1'b0;
- i_dat = 32'h8;
- #20
- i_vld = 1'b1;
- o_rdy = 1'b0;
- i_dat = 32'h12;
- #20
- i_vld = 1'b1;
- o_rdy = 1'b1;
- i_dat = 32'h2;
- #20
- i_vld = 1'b1;
- o_rdy = 1'b1;
- i_dat = 32'h11;
- #20
- i_vld = 1'b1;
- o_rdy = 1'b1;
- i_dat = 32'h13;
- #20
- i_vld = 1'b1;
- o_rdy = 1'b1;
- i_dat = 32'h6;
- #20
- i_vld = 1'b1;
- o_rdy = 1'b1;
- i_dat = 32'h22;
- #20
- i_vld = 1'b1;
- o_rdy = 1'b1;
- i_dat = 32'h99;
- #20
- i_vld = 1'b1;
- o_rdy = 1'b1;
- i_dat = 32'h33;
- #20
- i_vld = 1'b0;
- o_rdy = 1'b1;
- i_dat = 32'h17;
- #20
- i_vld = 1'b1;
- o_rdy = 1'b1;
- i_dat = 32'h3;
- #500 $finish;
- end
- initial
- $monitor($time,,,"clk=%b,rst_n=%b,i_vld=%b,o_rdy=%b, i_rdy=%b, o_vld=%b,",clk,rst_n,i_vld,o_rdy,i_rdy,o_vld);
- initial
- begin
- //$dumpfile("dump.vcd");
- //$dumpvars;
- $fsdbDumpfile("dump.fsdb");
- $fsdbDumpvars("+all");
- end
- endmodule
如果用上面的testbench,则变成普通的buffer,没有bypass
E203 bypass buffer的更多相关文章
- Method and system for early speculative store-load bypass
In an embodiment, the present invention describes a method and apparatus for detecting RAW condition ...
- 优化ABAP性能(摘录)
1.使用where语句不推荐Select * from zflight.Check : zflight-airln = ‘LF’ and zflight-fligh = ‘BW222’.Endsele ...
- abap 常用 function
ABAP常用函数总结 alv .smartform. excel .text.邮件 .远程访问,FTP服务器... **********常用功能function REUSE_ALV_GRID_DI ...
- Kingsoft Office Writer 2012 8.1.0.3385 - (.wps) Buffer Overflow Exploit (SEH)
#!/usr/bin/python # Exploit Title: Kingsoft Office Writer v2012 8.1.0.3385 .wps Buffer Overflow Expl ...
- Buffer Data
waylau/netty-4-user-guide: Chinese translation of Netty 4.x User Guide. 中文翻译<Netty 4.x 用户指南> h ...
- Tuning 04 Sizing the Buffer Cache
Buffer Cache 特性 The buffer cache holds copies of the data blocks from the data files. Because the bu ...
- Speculative store buffer
A speculative store buffer is speculatively updated in response to speculative store memory operatio ...
- 蜂鸟E203 IFU模块
E203的IFU(instruction fetch unit)模块主要功能和接口如下: IFU的PC生成单元产生下一条指令的PC. 该PC传输到地址判断和ICB生成单元,就是根据PC值产生相应读指请 ...
- E203 同步fifo
1. 输入端, 输入信号, i_vld,表示输入请求写同步fifo,如果fifo不满,则fifo发送i_rdy 到输入端,开始写fifo.i_vld和i_rdy是写握手信号. 2.输出端 o_rdy表 ...
随机推荐
- 连接常见错误linker command failed with exit code 1 (use -v to see invocation)
这种问题,通常出现在添加第三方库文件或者多人开发时. 这种问题一般是找不到文件而导致的链接错误. 我们可以从如下几个方面着手排查. 1.以如下错误为例,如果是多人开发,你同步完成后发现出现如下的错误. ...
- python基础 while 字符串方法 运算符
一.while 1.while 死循环 f=True while f: print(1) print(2) 2.while 活循环 ①.正序 count = 1 while count <= 5 ...
- Linux根目录下各目录含义
/boot:系统启动的相关文件,比如内核,grub /etc:配置文件 /dev:设备文件 /root:root用户的家目录 /home:用户家目录 /lib:库文件 /bin:用户的命令文件 /sb ...
- Asp.Net Core 开发之旅之NLog日志
NLog已是日志库的一员大佬,使用也简单方便,本文介绍的环境是居于.NET CORE 3.0 1.安装 Install-Package NLog.Web.AspNetCore 2.创建配置文件 在we ...
- [视频教程] docker端口映射与目录共享运行PHP
当我们在容器中安装完环境以后,需要在宿主机的端口上访问到容器中的端口,这时候就需要做端口映射.在开发代码的时候,需要频繁的修改代码,因此要把宿主机上的代码目录共享到容器中,这样容器里面就能访问的到代码 ...
- 5-4 可视化库Seaborn-回归分析
In [2]: %matplotlib inline import numpy as np import pandas as pd from scipy import stats,integrate ...
- jmeter beanshell断言接口自动化实例
一.JMeter介绍 Apache JMeter是一款优秀的开源性能测试工具,在国外无论是在性能测试还是接口测试领域都有着非常高的使用率,但由于本身没有完善的中文文档以及典型开源工具特点(界面不美观) ...
- JVM的内存结构以及性能调优
JVM的内存结构以及性能调优 发布时间: 2017-11-22 阅读数: 16675 JVM的内存结构以及性能调优1:JVM的结构主要包括三部分,堆,栈,非堆内存(方法区,驻留字符串)堆上面存储的是引 ...
- 关于appium的简单理解
搭建好appium环境后,要学会定位app页面上的元素.下面是2款元素定位工具 uiautomatorviewer -- Android SDK自带的元素定位工具,由Google开发的 Inspe ...
- 【转】Redis相关
1. 什么是redis? Redis 是一个使用 C 语言写成的,开源的基于内存的高性能key-value数据库. Redis的值可以是由string(字符串).hash(哈希).list(列表) ...