如果fifo中没有数据,且有输入,则是bypass fifo,同周期内直接把输入数据转到输出数据。如果fifo中有数据,则读取fifo,成为普通的同步fifo。

  1. module sirv_gnrl_bypbuf # (
  2. parameter DP = 8,
  3. parameter DW = 32
  4. ) (
  5. input i_vld,
  6. output i_rdy,
  7. input [DW-1:0] i_dat,
  8.  
  9. output o_vld,
  10. input o_rdy,
  11. output [DW-1:0] o_dat,
  12.  
  13. input clk,
  14. input rst_n
  15. );
  16.  
  17. wire fifo_i_vld;
  18. wire fifo_i_rdy;
  19. wire [DW-1:0] fifo_i_dat;
  20.  
  21. wire fifo_o_vld;
  22. wire fifo_o_rdy;
  23. wire [DW-1:0] fifo_o_dat;
  24.  
  25. sirv_gnrl_fifo # (
  26. .DP(DP),
  27. .DW(DW),
  28. .CUT_READY(1)
  29. ) u_bypbuf_fifo(
  30. .i_vld (fifo_i_vld),
  31. .i_rdy (fifo_i_rdy),
  32. .i_dat (fifo_i_dat),
  33. .o_vld (fifo_o_vld),
  34. .o_rdy (fifo_o_rdy),
  35. .o_dat (fifo_o_dat),
  36. .clk (clk ),
  37. .rst_n (rst_n)
  38. );
  39.  
  40. // This module is a super-weapon for timing fix,
  41. // but it is tricky, think it harder when you are reading, or contact Bob Hu
  42.  
  43. assign i_rdy = fifo_i_rdy;
  44.  
  45. // The FIFO is bypassed when:
  46. // * fifo is empty, and o_rdy is high
  47. wire byp = i_vld & o_rdy & (~fifo_o_vld);
  48.  
  49. // FIFO o-ready just use the o_rdy
  50. assign fifo_o_rdy = o_rdy;
  51.  
  52. // The output is valid if FIFO or input have valid
  53. assign o_vld = fifo_o_vld | i_vld;
  54.  
  55. // The output data select the FIFO as high priority
  56. assign o_dat = fifo_o_vld ? fifo_o_dat : i_dat;
  57.  
  58. assign fifo_i_dat = i_dat;
  59.  
  60. // Only pass to FIFO i-valid if FIFO is not bypassed
  61. assign fifo_i_vld = i_vld & (~byp);
  62.  
  63. endmodule
  1. module sirv_gnrl_dffs_tb;
  2.  
  3. reg clk=0,rst_n;
  4. reg i_vld, o_rdy;
  5. reg [31:0] i_dat;
  6.  
  7. wire i_rdy, o_vld;
  8. wire [31:0] o_dat;
  9.  
  10. 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));
  11.  
  12. always #10 clk=~clk;
  13.  
  14. initial
  15. begin
  16. rst_n=1'b1;
  17. i_vld = 1'b0;
  18. o_rdy = 1'b0;
  19. i_dat = 32'h12345678;
  20. #20
  21. rst_n=1'b0;
  22. #80
  23. rst_n=1'b1;
  24. #80
  25. i_vld = 1'b1;
  26. o_rdy = 1'b1;
  27. i_dat = 32'h8;
  28. #20
  29. i_vld = 1'b1;
  30. o_rdy = 1'b1;
  31. i_dat = 32'h12;
  32. #20
  33. i_vld = 1'b1;
  34. o_rdy = 1'b1;
  35. i_dat = 32'h2;
  36. #20
  37. i_vld = 1'b1;
  38. o_rdy = 1'b1;
  39. i_dat = 32'h11;
  40. #20
  41. i_vld = 1'b1;
  42. o_rdy = 1'b1;
  43. i_dat = 32'h13;
  44. #20
  45. i_vld = 1'b1;
  46. o_rdy = 1'b1;
  47. i_dat = 32'h6;
  48. #20
  49. i_vld = 1'b1;
  50. o_rdy = 1'b1;
  51. i_dat = 32'h22;
  52. #20
  53. i_vld = 1'b1;
  54. o_rdy = 1'b1;
  55. i_dat = 32'h99;
  56. #20
  57. i_vld = 1'b1;
  58. o_rdy = 1'b1;
  59. i_dat = 32'h33;
  60. #20
  61. i_vld = 1'b0;
  62. o_rdy = 1'b1;
  63. i_dat = 32'h17;
  64. #20
  65. i_vld = 1'b1;
  66. o_rdy = 1'b1;
  67. i_dat = 32'h3;
  68. #500 $finish;
  69. end
  70.  
  71. initial
  72. $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);
  73. initial
  74. begin
  75. //$dumpfile("dump.vcd");
  76. //$dumpvars;
  77. $fsdbDumpfile("dump.fsdb");
  78. $fsdbDumpvars("+all");
  79. end
  80.  
  81. endmodule

用上面的testbench,可以看到是bypass buffer,fifo_o_vld总为0

  1. module sirv_gnrl_dffs_tb;
  2.  
  3. reg clk=0,rst_n;
  4. reg i_vld, o_rdy;
  5. reg [31:0] i_dat;
  6.  
  7. wire i_rdy, o_vld;
  8. wire [31:0] o_dat;
  9.  
  10. 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));
  11.  
  12. always #10 clk=~clk;
  13.  
  14. initial
  15. begin
  16. rst_n=1'b1;
  17. i_vld = 1'b0;
  18. o_rdy = 1'b0;
  19. i_dat = 32'h12345678;
  20. #20
  21. rst_n=1'b0;
  22. #80
  23. rst_n=1'b1;
  24. #80
  25. i_vld = 1'b1;
  26. o_rdy = 1'b0;
  27. i_dat = 32'h8;
  28. #20
  29. i_vld = 1'b1;
  30. o_rdy = 1'b0;
  31. i_dat = 32'h12;
  32. #20
  33. i_vld = 1'b1;
  34. o_rdy = 1'b1;
  35. i_dat = 32'h2;
  36. #20
  37. i_vld = 1'b1;
  38. o_rdy = 1'b1;
  39. i_dat = 32'h11;
  40. #20
  41. i_vld = 1'b1;
  42. o_rdy = 1'b1;
  43. i_dat = 32'h13;
  44. #20
  45. i_vld = 1'b1;
  46. o_rdy = 1'b1;
  47. i_dat = 32'h6;
  48. #20
  49. i_vld = 1'b1;
  50. o_rdy = 1'b1;
  51. i_dat = 32'h22;
  52. #20
  53. i_vld = 1'b1;
  54. o_rdy = 1'b1;
  55. i_dat = 32'h99;
  56. #20
  57. i_vld = 1'b1;
  58. o_rdy = 1'b1;
  59. i_dat = 32'h33;
  60. #20
  61. i_vld = 1'b0;
  62. o_rdy = 1'b1;
  63. i_dat = 32'h17;
  64. #20
  65. i_vld = 1'b1;
  66. o_rdy = 1'b1;
  67. i_dat = 32'h3;
  68. #500 $finish;
  69. end
  70.  
  71. initial
  72. $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);
  73. initial
  74. begin
  75. //$dumpfile("dump.vcd");
  76. //$dumpvars;
  77. $fsdbDumpfile("dump.fsdb");
  78. $fsdbDumpvars("+all");
  79. end
  80.  
  81. endmodule

如果用上面的testbench,则变成普通的buffer,没有bypass

E203 bypass buffer的更多相关文章

  1. Method and system for early speculative store-load bypass

    In an embodiment, the present invention describes a method and apparatus for detecting RAW condition ...

  2. 优化ABAP性能(摘录)

    1.使用where语句不推荐Select * from zflight.Check : zflight-airln = ‘LF’ and zflight-fligh = ‘BW222’.Endsele ...

  3. abap 常用 function

    ABAP常用函数总结  alv .smartform. excel .text.邮件 .远程访问,FTP服务器...  **********常用功能function REUSE_ALV_GRID_DI ...

  4. 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 ...

  5. Buffer Data

    waylau/netty-4-user-guide: Chinese translation of Netty 4.x User Guide. 中文翻译<Netty 4.x 用户指南> h ...

  6. Tuning 04 Sizing the Buffer Cache

    Buffer Cache 特性 The buffer cache holds copies of the data blocks from the data files. Because the bu ...

  7. Speculative store buffer

    A speculative store buffer is speculatively updated in response to speculative store memory operatio ...

  8. 蜂鸟E203 IFU模块

    E203的IFU(instruction fetch unit)模块主要功能和接口如下: IFU的PC生成单元产生下一条指令的PC. 该PC传输到地址判断和ICB生成单元,就是根据PC值产生相应读指请 ...

  9. E203 同步fifo

    1. 输入端, 输入信号, i_vld,表示输入请求写同步fifo,如果fifo不满,则fifo发送i_rdy 到输入端,开始写fifo.i_vld和i_rdy是写握手信号. 2.输出端 o_rdy表 ...

随机推荐

  1. 连接常见错误linker command failed with exit code 1 (use -v to see invocation)

    这种问题,通常出现在添加第三方库文件或者多人开发时. 这种问题一般是找不到文件而导致的链接错误. 我们可以从如下几个方面着手排查. 1.以如下错误为例,如果是多人开发,你同步完成后发现出现如下的错误. ...

  2. python基础 while 字符串方法 运算符

    一.while 1.while 死循环 f=True while f: print(1) print(2) 2.while 活循环 ①.正序 count = 1 while count <= 5 ...

  3. Linux根目录下各目录含义

    /boot:系统启动的相关文件,比如内核,grub /etc:配置文件 /dev:设备文件 /root:root用户的家目录 /home:用户家目录 /lib:库文件 /bin:用户的命令文件 /sb ...

  4. Asp.Net Core 开发之旅之NLog日志

    NLog已是日志库的一员大佬,使用也简单方便,本文介绍的环境是居于.NET CORE 3.0 1.安装 Install-Package NLog.Web.AspNetCore 2.创建配置文件 在we ...

  5. [视频教程] docker端口映射与目录共享运行PHP

    当我们在容器中安装完环境以后,需要在宿主机的端口上访问到容器中的端口,这时候就需要做端口映射.在开发代码的时候,需要频繁的修改代码,因此要把宿主机上的代码目录共享到容器中,这样容器里面就能访问的到代码 ...

  6. 5-4 可视化库Seaborn-回归分析

    In [2]: %matplotlib inline import numpy as np import pandas as pd from scipy import stats,integrate ...

  7. jmeter beanshell断言接口自动化实例

    一.JMeter介绍 Apache JMeter是一款优秀的开源性能测试工具,在国外无论是在性能测试还是接口测试领域都有着非常高的使用率,但由于本身没有完善的中文文档以及典型开源工具特点(界面不美观) ...

  8. JVM的内存结构以及性能调优

    JVM的内存结构以及性能调优 发布时间: 2017-11-22 阅读数: 16675 JVM的内存结构以及性能调优1:JVM的结构主要包括三部分,堆,栈,非堆内存(方法区,驻留字符串)堆上面存储的是引 ...

  9. 关于appium的简单理解

    搭建好appium环境后,要学会定位app页面上的元素.下面是2款元素定位工具 uiautomatorviewer   -- Android SDK自带的元素定位工具,由Google开发的 Inspe ...

  10. 【转】Redis相关

      1. 什么是redis? Redis 是一个使用 C 语言写成的,开源的基于内存的高性能key-value数据库. Redis的值可以是由string(字符串).hash(哈希).list(列表) ...