// (C) Tomonori Izumi , Aug. 2012. All rigts reserved. // いずみ研 valid/wait インターフェース サンプル回路 // 受け取ったら2段のパイプライン計算をして次に渡す // バースト(休止サイクル無し)動作が可能 // レジスタを通らない組合せロジックのみのパスが発生してしまう(owait->iwait) // パスを切るには入力あるいは出力にFIFO(短くて良い)を置く module ifsmpl (xrst,clk, idata,ivalid,iwait, odata,ovalid,owait); input xrst,clk; input [15:0] idata; input ivalid; output iwait; output [15:0] odata; output ovalid; input owait; reg [15:0] data1_reg, data2_reg, data3_reg; reg valid1_reg, valid2_reg, valid3_reg; wire valid0,valid1,valid2,valid3; wire wait0,wait1,wait2,wait3; assign valid0=ivalid; assign valid1=valid1_reg; assign valid2=valid2_reg; assign valid3=valid3_reg; assign wait0=wait1&valid1_reg; // 渋滞先読み(筒抜けパス) assign wait1=wait2&valid2_reg; // 渋滞先読み(筒抜けパス) assign wait2=wait3&valid3_reg; // 渋滞先読み(筒抜けパス) assign wait3=owait; assign iwait=wait0; assign ovalid=valid3; assign odata=data3_reg; // 何らかの計算1 function [15:0] calc1; input [15:0] data; begin calc1=data; // 「何もしない」という計算 end endfunction // 何らかの計算2 function [15:0] calc2; input [15:0] data; begin calc2=data; // 「何もしない」という計算 end endfunction // [PIPELINE STAGE1] Receive always @(posedge clk or negedge xrst) begin if (!xrst) begin data1_reg<=16'hffff; valid1_reg<=0; end else if (valid0&!wait0) begin // 受取成立 data1_reg<=idata; valid1_reg<=1; end else if (valid1&!wait1) begin // 受取不成立かつ送出成立 data1_reg<=16'hffff; // デバグ用(実際は不要) valid1_reg<=0; end end // [PIPELINE STAGE2] Calculation 1 always @(posedge clk or negedge xrst) begin if (!xrst) begin data2_reg<=16'hffff; valid2_reg<=0; end else if (valid1&!wait1) begin // 受取成立 data2_reg<=calc1(data1_reg); // 1段目の計算 valid2_reg<=1; end else if (valid2&!wait2) begin // 受取不成立かつ送出成立 data2_reg<=16'hffff; // デバグ用(実際は不要) valid2_reg<=0; end end // [PIPELINE STAGE3] Calculation 2 always @(posedge clk or negedge xrst) begin if (!xrst) begin data3_reg<=16'hffff; valid3_reg<=0; end else if (valid2&!wait2) begin // 受取成立 data3_reg<=calc2(data2_reg); // 2段目の計算 valid3_reg<=1; end else if (valid3&!wait3) begin // 受取不成立かつ送出成立 data3_reg<=16'hffff; // デバグ用(実際は不要) valid3_reg<=0; end end endmodule