1. Design Specifications

  • Clock rate = 100MHz
  • Synchronous reset
  • 입력과 출력 신호는 2채널, 각각 16bit 데이터 크기를 가짐.
  • 입력 데이터가 16’h0000 or 16’hFFFF 인 경우는 1 clock cycle 후 그대로 latch 되어 출력(이전 값 유지).
  • 그 외 입력 데이터의 경우에는 correction factor(cf)를 곱하여 1 clock cycle 후 출력.
  • enable = 1 인 경우에만 위 동작을 수행하고 아닌 경우는 이전 값을 그대로 유지.


2. RTL Design

※ pipe module
module pipe (
  input i_clk,
  input i_rstn,

  input i_en,
  input [1:0] i_cf,

  input [15:0] i_data0,
  input [15:0] i_data1,

  output reg [15:0] o_data0,
  output reg [15:0] o_data1
);

  reg [15:0] r_data0, r_data1; //, o_data0, o_data1;

  /* DUT explanation:
  Latch the input data to the output register if it is 16'h0000 or 16h'FFFF.
  If not, multiply by correction factor(cf).
  */

  always @(posedge i_clk) begin
    if (~i_rstn) begin
      r_data0 <= 16'h0;
      r_data1 <= 16'h0;
    end
  else begin
    if (i_en) begin
      if ((i_data0 == 16'h0000) || (i_data0 == 16'hFFFF)) begin
        r_data0 <= i_data0;
      end
      else begin
        r_data0 <= i_data0 * i_cf;
      end

     if ((i_data1 == 16'h0000) || (i_data1 == 16'hFFFF)) begin
       r_data1 <= i_data1;
     end
     else begin
       r_data1 <= i_data1 * i_cf;
     end
   end
  end
end


  always @(posedge i_clk) begin
    o_data0 <= r_data0;
    o_data1 <= r_data1;
  end
 

 

※ pipe interface
interface pipe_if;

  logic CLK;
  logic RSTN;

  logic [1:0] I_CF;
  logic I_ENABLE;
  logic [15:0] I_DATA_IN0;
  logic [15:0] I_DATA_IN1;
  logic [15:0] O_DATA_OUT0;
  logic [15:0] O_DATA_OUT1;

  logic [1:0] O_CF;
  logic O_ENABLE;
endinterface