論理回路デザイン |
|
OK時 | NG時 |
/* **************************** MODULE PREAMBLE ******************************** Copyright (c) 2012, ArchiTek This document constitutes confidential and proprietary information of ArchiTek. All rights reserved. */ // ***************************** MODULE HEADER ********************************* module master ( req, gnt, rxw, addr, wrStrb, wrAck, wrFlush, wrData, wrMask, rdStrb, rdAck, rdFlush, rdData, omit, exec, error, reset, clk ); // ************************ PARAMETER DECLARATIONS ***************************** // topモジュールで再設定可能 parameter PAM = 32'hffffffff; // バスの語長とバースト長、topモジュールで再設定可能 parameter NLR = 2; // Word Length Radix parameter BLR = 2; // Burst Length Radix parameter NL = 1<<NLR; parameter NBL = 8<<NLR; // ***************************** I/O DECLARATIONS ****************************** // Requestパス output req; input gnt; output rxw; output [31:0] addr; // Write Dataパス output wrStrb; input wrAck; input wrFlush; output [NBL-1:0] wrData; output [NL-1:0] wrMask; // Read Dataパス output rdStrb; input rdAck; input rdFlush; input [NBL-1:0] rdData; input omit; input reset; input clk; // 実行動作中およびエラーを表示するLED出力 output [5:0] exec; // execution LED output error; // diff error LED // ************************** LOCAL DECLARATIONS ******************************* reg req; reg rxw; reg [31:0] addr; // データマスクなし reg [NBL-1:0] wrData; wire [NL-1:0] wrMask = {NL{1'b0}}; // ライトストローブは常時有効 wire wrStrb = 1'b1; wire wrAlloc = wrStrb & wrAck; // リードストローブも常時有効 wire rdStrb = 1'b1; wire rdAlloc = rdStrb & rdAck; wire alloc = req & gnt; reg [NBL-1:0] rdExp; wire diff; reg [16:0] rdCount; reg [5:0] exec; reg error; // ******************************** MODULE BODY ******************************** // ----------------------------------------------------------------------------- // Req always @(posedge clk) if (reset) req <= #1 1'b0; else req <= #1 !omit & (addr <= PAM); // アドレスインクリメント always @(posedge clk) if (reset) addr <= #1 32'd0; else if (alloc) addr <= #1 (addr + (1<<BLR+NLR)) & PAM; // アドレス上限までのライト/リード繰り返し always @(posedge clk) if (reset) rxw <= #1 1'b0; else if (gnt & (addr[31:BLR+NLR] == PAM[31:BLR+NLR])) rxw <= #1 !rxw; // ----------------------------------------------------------------------------- // Write Data Generate // デバイスのデータバス幅に応じたライトインクリメントデータ作成 always @(posedge clk) if (reset) wrData <= #1 {NBL{1'b0}}; else if (wrAlloc) wrData <= #1 wrData + {{NBL-1{1'b0}},1'b1}; // データマスクなし /* // Write Mask Generate always @(posedge clk) if (reset) wrMask <= #1 {NL{1'b0}}; else if (wrAlloc) wrMask <= #1 wrMask + {{NL-1{1'b0}},1'b1}; */ // ----------------------------------------------------------------------------- // Read Expect Data Generate // デバイスのデータバス幅に応じた期待値インクリメントデータ作成 always @(posedge clk) if (reset) rdExp <= #1 {NBL{1'b0}}; else if (rdAlloc) rdExp <= #1 rdExp + {{NBL-1{1'b0}},1'b1}; // ----------------------------------------------------------------------------- // Read Check // リードデータと期待値データの相違時error LED出力点灯 always @(posedge clk) if (!reset) error <= #1 1'b0; else if (diff) error <= #1 1'b1; // diff error // Read Count (1Gbit DDR3 device) always @(posedge clk) if (reset) rdCount <= #1 17'd0; else if (rdData[7:0] == 8'hfe) rdCount <= #1 rdCount + {16'b0,1'b1}; // 実行動作中、LED出力ローテーション点灯 // Execution Check always @(posedge clk) if (reset) exec <= #1 6'd0; else begin casex (rdCount[16:15]) 2'b00: exec <= #1 6'b000010; 2'b01: exec <= #1 6'b000100; 2'b10: exec <= #1 6'b001000; 2'b11: exec <= #1 6'b010000; endcase end // リードデータと期待値データを比較 assign diff = rdAlloc & !omit & (rdData != rdExp); endmodule // *****************************************************************************
回路デザイン > 設計例 [DDR制御(実装)] > 動作検証1 次のページ(動作検証2) このページのTOP ▲