ないデータFIFOと同じ期間内に出力データに直接データを入力する入力、バイパスFIFO、もし。データFIFOがある場合は、FIFOが読み込まれ、それは一般的な同期FIFOになります。
#sirv_gnrl_bypbufモジュール( パラメータDP = 8、 パラメータDW = 32 )(入力 i_vld、 出力i_rdy、入力 [DW-1:0] I_DAT、 出力o_vld、入力 o_rdy、 出力〔DW-1:0] o_dat、入力 CLK、 入力 RST_N )。 ワイヤーfifo_i_vld。 ワイヤーfifo_i_rdy。 ワイヤ〔DW-1:0] fifo_i_dat。 ワイヤーfifo_o_vld。 ワイヤーfifo_o_rdy。 ワイヤ〔DW-1:0] fifo_o_dat。 #(sirv_gnrl_fifo .DP(DP)、 .CUT_READY(1) .DW(DW)、 )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) )。 //このモジュールは、超兵器であるためタイミング修正、 //それはトリッキーで、あなたが読んでいる時に難しく、それを考える、またはボブ胡連絡 i_rdy = fifo_i_rdyを割り当てます。 :// FIFOがバイパスされたときに // * FIFOが空である、と o_rdyが高い (fifo_o_vld〜)ワイヤーBYP = i_vld&o_rdy&; // FIFO O-準備だけo_rdyを使用 割り当てるfifo_o_rdy = o_rdy。 //出力が有効である場合には FIFO または 入力が有効で持って o_vld = fifo_o_vld割り当てを| i_vld; 優先度が高いと//出力データはFIFOを選択 o_dat = fifo_o_vldを割り当てますか?fifo_o_dat:I_DAT。 fifo_i_dat = I_DATを割り当てます。 //のみFIFOに渡す私は -valid 場合は FIFOがされていないバイパス アサインfifo_i_vld = i_vld&(〜BYP)。 ENDMODULE
モジュールsirv_gnrl_dffs_tb。 REG CLK = 0、RST_N。 REG i_vld、o_rdy。 REG [31:0] I_DAT。 ワイヤi_rdy、o_vld。 線[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))。 常に#10 CLK =〜CLK; 初期は 始まる 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の。 #20 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。 o_rdy = 1'b1の。 I_DAT = 32'h17。 #20 i_vld = 1'b1の。 o_rdy = 1'b1の。 I_DAT = 32'h3。 #500 $フィニッシュ。終了 初期 $モニター($時間,,, " 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)。 初期には 開始 // $のダンプファイル( " dump.vcdを "); // $ dumpvars。 $ fsdbDumpfile( " dump.fsdb "); $ fsdbDumpvars( " +すべて "); エンド ENDMODULE
上記のテストベンチを使用して、fifo_o_vld常に0、バイパス・バッファを見ることができます
モジュールsirv_gnrl_dffs_tb。 REG CLK = 0、RST_N。 REG i_vld、o_rdy。 REG [31:0] I_DAT。 ワイヤi_rdy、o_vld。 線[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))。 常に#10 CLK =〜CLK; 初期は 始まる 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 o_rdy = 1'b1の。 I_DAT = 32'h17。 #20 i_vld = 1'b1の。 o_rdy = 1'b1の。 I_DAT = 32'h3。 #500 $フィニッシュ。終了 初期 $モニター($時間,,, " 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)。 初期には 開始 // $のダンプファイル( " dump.vcdを "); // $ dumpvars。 $ fsdbDumpfile( " dump.fsdb "); $ fsdbDumpvars( " +すべて "); エンド ENDMODULE
上記テストベンチは、通常のバッファー、無バイパスなった場合