2. fall_through_register.sv:フォールスルー動作レジスタ
基本設計方針
fall_through_register.svは、フォールスルー(fall-through)動作を実装したレジスタである。
出力側のモジュールが同じクロックサイクル内でデータを受け取る準備ができている場合、データを直接転送する(レジスタをバイパスする)。
このレジスタは、fifo_v3モジュールをDEPTH=1、FALL_THROUGH=1で使用して実装されている。
パラメータ定義
module fall_through_register #( parameter type T = logic // Vivado requires a default value for type parameters. ) ( input logic clk_i, // Clock input logic rst_ni, // Asynchronous active-low reset input logic clr_i, // Synchronous clear input logic testmode_i, // Test mode to bypass clock gating // Input port input logic valid_i, output logic ready_o, input T data_i, // Output port output logic valid_o, input logic ready_i, output T data_o );
実装詳細
logic fifo_empty, fifo_full; fifo_v3 #( .FALL_THROUGH (1'b1), .DEPTH (1), .dtype (T) ) i_fifo ( .clk_i (clk_i), .rst_ni (rst_ni), .flush_i (clr_i), .testmode_i (testmode_i), .full_o (fifo_full), .empty_o (fifo_empty), .usage_o (), .data_i (data_i), .push_i (valid_i & ~fifo_full), .data_o (data_o), .pop_i (ready_i & ~fifo_empty) ); assign ready_o = ~fifo_full; assign valid_o = ~fifo_empty;
フォールスルー動作の仕組み
fifo_v3のフォールスルーモードでは、FIFOが空(empty_o = 1)で、かつpush_iが有効な場合、データを直接data_oに出力する:
// FIFO is in pass through mode -> do not change the pointers if (FALL_THROUGH && (status_cnt_q == 0) && push_i) begin data_o = data_i; if (pop_i) begin status_cnt_n = status_cnt_q; read_pointer_n = read_pointer_q; write_pointer_n = write_pointer_q; end end