查看: 1184|回复: 0
收起左侧

E203 bypass buffer

[复制链接]

  离线 

  • TA的每日心情
    奋斗
    2021-3-3 12:32
  • 签到天数: 10 天

    [LV.3]

    发表于 2021-3-6 14:42:57 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 皋陶 于 2021-3-6 14:42 编辑

    如果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.   output          o_vld,
    9.   input           o_rdy,
    10.   output [DW-1:0] o_dat,

    11.   input           clk,
    12.   input           rst_n
    13. );


    14.   wire          fifo_i_vld;
    15.   wire          fifo_i_rdy;
    16.   wire [DW-1:0] fifo_i_dat;

    17.   wire          fifo_o_vld;
    18.   wire          fifo_o_rdy;
    19.   wire [DW-1:0] fifo_o_dat;

    20.   sirv_gnrl_fifo # (
    21.        .DP(DP),
    22.        .DW(DW),
    23.        .CUT_READY(1)
    24.   ) u_bypbuf_fifo(
    25.     .i_vld   (fifo_i_vld),
    26.     .i_rdy   (fifo_i_rdy),
    27.     .i_dat   (fifo_i_dat),
    28.     .o_vld   (fifo_o_vld),
    29.     .o_rdy   (fifo_o_rdy),
    30.     .o_dat   (fifo_o_dat),
    31.     .clk     (clk  ),
    32.     .rst_n   (rst_n)
    33.   );

    34.    // This module is a super-weapon for timing fix,
    35.    // but it is tricky, think it harder when you are reading, or contact Bob Hu

    36.   assign i_rdy = fifo_i_rdy;

    37.   // The FIFO is bypassed when:
    38.   //   * fifo is empty, and o_rdy is high
    39.   wire byp = i_vld & o_rdy & (~fifo_o_vld);

    40.   // FIFO o-ready just use the o_rdy
    41.   assign fifo_o_rdy = o_rdy;

    42.   // The output is valid if FIFO or input have valid
    43.   assign o_vld = fifo_o_vld | i_vld;

    44.   // The output data select the FIFO as high priority
    45.   assign o_dat = fifo_o_vld ? fifo_o_dat : i_dat;

    46.   assign fifo_i_dat  = i_dat;

    47.   // Only pass to FIFO i-valid if FIFO is not bypassed
    48.   assign fifo_i_vld = i_vld & (~byp);


    49. endmodule
    复制代码
    1. module sirv_gnrl_dffs_tb;

    2.    reg  clk=0,rst_n;
    3.    reg  i_vld, o_rdy;
    4.    reg  [31:0] i_dat;

    5.    wire i_rdy, o_vld;
    6.    wire [31:0] o_dat;

    7.    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));

    8.    always #10 clk=~clk;

    9.    initial
    10.    begin
    11.         rst_n=1'b1;
    12.         i_vld = 1'b0;
    13.         o_rdy = 1'b0;
    14.         i_dat = 32'h12345678;
    15.         #20
    16.         rst_n=1'b0;
    17.         #80
    18.         rst_n=1'b1;
    19.         #80
    20.         i_vld = 1'b1;
    21.         o_rdy = 1'b1;
    22.         i_dat = 32'h8;
    23.         #20
    24.         i_vld = 1'b1;
    25.         o_rdy = 1'b1;
    26.         i_dat = 32'h12;
    27.         #20
    28.         i_vld = 1'b1;
    29.         o_rdy = 1'b1;
    30.         i_dat = 32'h2;
    31.         #20
    32.         i_vld = 1'b1;
    33.         o_rdy = 1'b1;
    34.         i_dat = 32'h11;
    35.         #20
    36.         i_vld = 1'b1;
    37.         o_rdy = 1'b1;
    38.         i_dat = 32'h13;
    39.         #20
    40.         i_vld = 1'b1;
    41.         o_rdy = 1'b1;
    42.         i_dat = 32'h6;
    43.         #20
    44.         i_vld = 1'b1;
    45.         o_rdy = 1'b1;
    46.         i_dat = 32'h22;
    47.         #20
    48.         i_vld = 1'b1;
    49.         o_rdy = 1'b1;
    50.         i_dat = 32'h99;
    51.         #20
    52.         i_vld = 1'b1;
    53.         o_rdy = 1'b1;
    54.         i_dat = 32'h33;
    55.         #20
    56.         i_vld = 1'b0;
    57.         o_rdy = 1'b1;
    58.         i_dat = 32'h17;
    59.         #20
    60.         i_vld = 1'b1;
    61.         o_rdy = 1'b1;
    62.         i_dat = 32'h3;
    63.         #500 $finish;
    64.    end

    65.    initial
    66.            $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);
    67.    initial
    68.    begin
    69.            //$dumpfile("dump.vcd");
    70.            //$dumpvars;
    71.            $fsdbDumpfile("dump.fsdb");
    72.         $fsdbDumpvars("+all");
    73.    end



    74.    endmodule
    复制代码

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


    国内芯片技术交流-E203 bypass bufferrisc-v单片机中文社区(1)

    1. module sirv_gnrl_dffs_tb;

    2.    reg  clk=0,rst_n;
    3.    reg  i_vld, o_rdy;
    4.    reg  [31:0] i_dat;

    5.    wire i_rdy, o_vld;
    6.    wire [31:0] o_dat;

    7.    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));

    8.    always #10 clk=~clk;

    9.    initial
    10.    begin
    11.         rst_n=1'b1;
    12.         i_vld = 1'b0;
    13.         o_rdy = 1'b0;
    14.         i_dat = 32'h12345678;
    15.         #20
    16.         rst_n=1'b0;
    17.         #80
    18.         rst_n=1'b1;
    19.         #80
    20.         i_vld = 1'b1;
    21.         o_rdy = 1'b0;
    22.         i_dat = 32'h8;
    23.         #20
    24.         i_vld = 1'b1;
    25.         o_rdy = 1'b0;
    26.         i_dat = 32'h12;
    27.         #20
    28.         i_vld = 1'b1;
    29.         o_rdy = 1'b1;
    30.         i_dat = 32'h2;
    31.         #20
    32.         i_vld = 1'b1;
    33.         o_rdy = 1'b1;
    34.         i_dat = 32'h11;
    35.         #20
    36.         i_vld = 1'b1;
    37.         o_rdy = 1'b1;
    38.         i_dat = 32'h13;
    39.         #20
    40.         i_vld = 1'b1;
    41.         o_rdy = 1'b1;
    42.         i_dat = 32'h6;
    43.         #20
    44.         i_vld = 1'b1;
    45.         o_rdy = 1'b1;
    46.         i_dat = 32'h22;
    47.         #20
    48.         i_vld = 1'b1;
    49.         o_rdy = 1'b1;
    50.         i_dat = 32'h99;
    51.         #20
    52.         i_vld = 1'b1;
    53.         o_rdy = 1'b1;
    54.         i_dat = 32'h33;
    55.         #20
    56.         i_vld = 1'b0;
    57.         o_rdy = 1'b1;
    58.         i_dat = 32'h17;
    59.         #20
    60.         i_vld = 1'b1;
    61.         o_rdy = 1'b1;
    62.         i_dat = 32'h3;
    63.         #500 $finish;
    64.    end

    65.    initial
    66.            $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);
    67.    initial
    68.    begin
    69.            //$dumpfile("dump.vcd");
    70.            //$dumpvars;
    71.            $fsdbDumpfile("dump.fsdb");
    72.         $fsdbDumpvars("+all");
    73.    end



    74.    endmodule
    复制代码

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


    国内芯片技术交流-E203 bypass bufferrisc-v单片机中文社区(2)






    上一篇:E203 同步fifo
    下一篇:蜂鸟E203 IFU模块
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-11-26 08:17 , Processed in 0.261510 second(s), 48 queries .

    快速回复 返回顶部 返回列表