DDRモードを有効にする方法
ご存知のように、RTシリーズMCUはXIP (Execute in place) モードをサポートしており、ピン数を節約できるという利点があります。FlexSPIモジュールはシリアルNORフラッシュからコードとデータを非常に効率的に取得してCortex-M7を実行できるため、シリアルNORフラッシュが最も一般的に使用されています。
フェッチ方法はQuad IO Fast Readコマンドを利用して実装されています。一方、シリアルNORフラッシュはSDR(単一データ転送レート)モードで動作し、SCLKの立ち上がりエッジでデータを受信し、SCLKの立ち下がりエッジでデータを送信します。SDRモードと比較すると、DDR(デュアルデータ転送レート)モードはスループット容量が高く、XIPモードでより良いパフォーマンスを提供できるかどうか、またシリアルNORフラッシュをDDRモードで動作させる方法について教えてください。
SDR & DDR mode
SDRモード:
SDR(シングルデータ転送レート)モードでは、データはクロックの一方のエッジ(立ち上がりエッジまたは立ち下がりエッジ)でのみクロックされます。つまり、SDRでデータがX Mbpsで送信されるには、クロック・ビット・レートが2X Mbpsである必要があります。
DDR mode:
DDR(デュアルデータ転送レート)モード(DTR(デュアル転送レート)モードとも呼ばれる)では、データはクロックの立ち上がりエッジと立ち下がりエッジの両方で転送されます。これは、データがX Mbpsで伝送される場合、クロック・ビット・レートもX Mbpsである必要があり、したがって帯域幅が2倍になることを意味します(図1を参照)。
図1
DDRモードを有効にする
以下の手順は、DDRモードで動作するi.MX RT1060をQSPIから起動する方法を示しています。
注記:ボードは MIMXRT1060、IDEは MCUXpresso IDEです
hello_worldをテンプレートとして開きます
FDCB(フラッシュデバイス構成ブロック)を変更する
a) controllerMiscOptionパラメータをDDR読み取りコマンドをサポートするように設定してください。
b) シリアル・フラッシュ周波数を60MHzに設定します。
c) DDR読み出しコマンドをコマンド・シーケンスに解析します。 次の表は、DDR Quad IO FAST READ 命令のテンプレートコマンド・シーケンスを示しており、IS25WP064のFRQDTR (Fast Read Quad IO DTR) シーケンスとほぼ一致しています(図2を参照)。
図2 FRQDTRシーケンス
d)ダミーサイクルを調整します。
ダミーサイクルは特定のシリアルクロック周波数と一致する必要があり、FRQDTRシーケンスコマンドのデフォルトのダミーサイクルは6です(以下の表に示すように)。
しかし、シリアルクロックの周波数が60MHzの場合、ダミーサイクルは4に変更する必要があります(以下の表を参照してください)。
そのため、FDCB に SET READ PARAMETERS コマンドシーケンス(図 3 参照)を手動で追加し、読み取りレジスタの [P6:P3] ビット(下表参照)を設定する必要があります。
図3 SET READ PARAMETERS コマンドシーケンス
さらに、DDRモードでは、SCLKサイクルはシリアル・ルート・クロック・サイクルの2倍になります。オペランドの値は、デバイスのデータシートでダミー・サイクルがどのように定義されているかに応じて 2N、2N-1、または2*N+1 に設定する必要があります。
最終的に、以下のように調整されたFCDBを取得できます。
// Set Dummy Cycles
#define FLASH_DUMMY_CYCLES 8
// Set Read register command sequence's Index in LUT table
#define CMD_LUT_SEQ_IDX_SET_READ_PARAM 7
// Read,Read Status,Write Enable command sequences' Index in LUT table
#define CMD_LUT_SEQ_IDX_READ 0
#define CMD_LUT_SEQ_IDX_READSTATUS 1
#define CMD_LUT_SEQ_IDX_WRITEENABLE 3
const flexspi_nor_config_t qspiflash_config = {
.memConfig =
{
.tag = FLEXSPI_CFG_BLK_TAG,
.version = FLEXSPI_CFG_BLK_VERSION,
.readSampleClksrc=kFlexSPIReadSampleClk_LoopbackFromDqsPad,
.csHoldTime = 3u,
.csSetupTime = 3u,
// Enable DDR mode
.controllerMiscOption = kFlexSpiMiscOffset_DdrModeEnable | kFlexSpiMiscOffset_SafeConfigFreqEnable,
.sflashPadType = kSerialFlash_4Pads,
//.serialClkFreq = kFlexSpiSerialClk_100MHz,
.serialClkFreq = kFlexSpiSerialClk_60MHz,
.sflashA1Size = 8u * 1024u * 1024u,
// Enable Flash register configuration
.configCmdEnable = 1u,
.configModeType[0] = kDeviceConfigCmdType_Generic,
.configCmdSeqs[0] =
{
.seqNum = 1,
.seqId = CMD_LUT_SEQ_IDX_SET_READ_PARAM,
.reserved = 0,
},
.lookupTable =
{
// Read LUTs
[4*CMD_LUT_SEQ_IDX_READ] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xED, RADDR_DDR, FLEXSPI_4PAD, 0x18),
// The MODE8_DDR subsequence costs 2 cycles that is part of the whole dummy cycles
[4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_DDR, FLEXSPI_4PAD, 0x00, DUMMY_DDR, FLEXSPI_4PAD, FLASH_DUMMY_CYCLES-2),
[4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_DDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0x00),
// READ STATUS REGISTER
[4*CMD_LUT_SEQ_IDX_READSTATUS] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x01),
[4*CMD_LUT_SEQ_IDX_READSTATUS + 1] = FLEXSPI_LUT_SEQ(STOP, FLEXSPI_1PAD, 0x00, 0, 0, 0),
// WRTIE ENABLE
[4*CMD_LUT_SEQ_IDX_WRITEENABLE] = FLEXSPI_LUT_SEQ(CMD_SDR,FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0x00),
// Set Read register
[4*CMD_LUT_SEQ_IDX_SET_READ_PARAM] = FLEXSPI_LUT_SEQ(CMD_SDR,FLEXSPI_1PAD, 0x63, WRITE_SDR, FLEXSPI_1PAD, 0x01),
[4*CMD_LUT_SEQ_IDX_SET_READ_PARAM + 1] = FLEXSPI_LUT_SEQ(STOP,FLEXSPI_1PAD, 0x00, 0, 0, 0),
},
},
.pageSize = 256u,
.sectorSize = 4u * 1024u,
.blockSize = 64u * 1024u,
.isUniformBlockSize = false,
};
DDRモードは本当に優れていますか?
RT1060のデータシートによると、以下の表はFlexSPI動作の最大周波数を示しています。MIMXRT1060のオンボードQSPIフラッシュはIS25WP064AJBLEで、MQSピンは含まれていません。MCR0.rxclksrc=1セット(内部ダミー・リード・ストロボとDQSからのループバック)が最も最適なオプションです。
動作モード
RXCLKsrc=0
RXCLKsrc=1
RXCLKsrc=3
SDR
60 MHz
133 MHz
166 MHz
DDR
30 MHz
66 MHz
166 MHz
言い換えると、QSPIは、SDRモードでは最大133 MHzまで動作できるのに対し、DDRモードでは66 MHzです。スループット容量の観点から見ると、ほぼ同じです。DDRモードはIS25WP064AJBLEにとってより良いオプションではないようで、次の実験でその仮定が検証されるでしょう。
実験
mbedtls_benchmark
最初のテスト・デモとして mbedtls_benchmarkを使用し、以下の条件でデモを実行します。
100MH、SDRモード;
133MHz, SDR mode;
66MHz, DDR mode;
対応するプリントアウトの情報(以下に示すように)に基づいて、比較用の表を作成し、図4に示すように、上記の3つの条件の中で実装項目のパフォーマンスが最悪のものをマークしました。
SDR Mode run at 100 MHz.
FlexSPI clock source is 3, FlexSPI Div is 6, PllPfd2Clk is 720000000
mbedTLS version 2.16.6
fsys=600000000
Using following implementations:
SHA: DCP HW accelerated
AES: DCP HW accelerated
AES GCM: Software implementation
DES: Software implementation
Asymmetric cryptography: Software implementation
MD5 : 18139.63 KB/s, 27.10 cycles/byte
SHA-1 : 44495.64 KB/s, 12.52 cycles/byte
SHA-256 : 47766.54 KB/s, 11.61 cycles/byte
SHA-512 : 2190.11 KB/s, 267.88 cycles/byte
3DES : 1263.01 KB/s, 462.49 cycles/byte
DES : 2962.18 KB/s, 196.33 cycles/byte
AES-CBC-128 : 52883.94 KB/s, 10.45 cycles/byte
AES-GCM-128 : 1755.38 KB/s, 329.33 cycles/byte
AES-CCM-128 : 2081.99 KB/s, 279.72 cycles/byte
CTR_DRBG (NOPR) : 5897.16 KB/s, 98.15 cycles/byte
CTR_DRBG (PR) : 4489.58 KB/s, 129.72 cycles/byte
HMAC_DRBG SHA-1 (NOPR) : 1297.53 KB/s, 448.03 cycles/byte
HMAC_DRBG SHA-1 (PR) : 1205.51 KB/s, 486.04 cycles/byte
HMAC_DRBG SHA-256 (NOPR) : 1786.18 KB/s, 327.70 cycles/byte
HMAC_DRBG SHA-256 (PR) : 1779.52 KB/s, 328.93 cycles/byte
RSA-1024 : 202.33 public/s
RSA-1024 : 7.00 private/s
DHE-2048 : 0.40 handshake/s
DH-2048 : 0.40 handshake/s
ECDSA-secp256r1 : 9.00 sign/s
ECDSA-secp256r1 : 4.67 verify/s
ECDHE-secp256r1 : 5.00 handshake/s
ECDH-secp256r1 : 9.33 handshake/s
DDR Mode run at 66 MHz.
FlexSPI clock source is 2, FlexSPI Div is 5, PllPfd2Clk is 396000000
mbedTLS version 2.16.6
fsys=600000000
Using following implementations:
SHA: DCP HW accelerated
AES: DCP HW accelerated
AES GCM: Software implementation
DES: Software implementation
Asymmetric cryptography: Software implementation
MD5 : 16047.13 KB/s, 27.12 cycles/byte
SHA-1 : 44504.08 KB/s, 12.54 cycles/byte
SHA-256 : 47742.88 KB/s, 11.62 cycles/byte
SHA-512 : 2187.57 KB/s, 267.18 cycles/byte
3DES : 1262.66 KB/s, 462.59 cycles/byte
DES : 2786.81 KB/s, 196.44 cycles/byte
AES-CBC-128 : 52807.92 KB/s, 10.47 cycles/byte
AES-GCM-128 : 1311.15 KB/s, 446.53 cycles/byte
AES-CCM-128 : 2088.84 KB/s, 281.08 cycles/byte
CTR_DRBG (NOPR) : 5966.92 KB/s, 97.55 cycles/byte
CTR_DRBG (PR) : 4413.15 KB/s, 130.42 cycles/byte
HMAC_DRBG SHA-1 (NOPR) : 1291.64 KB/s, 449.47 cycles/byte
HMAC_DRBG SHA-1 (PR) : 1202.41 KB/s, 487.05 cycles/byte
HMAC_DRBG SHA-256 (NOPR) : 1748.38 KB/s, 328.16 cycles/byte
HMAC_DRBG SHA-256 (PR) : 1691.74 KB/s, 329.78 cycles/byte
RSA-1024 : 201.67 public/s
RSA-1024 : 7.00 private/s
DHE-2048 : 0.40 handshake/s
DH-2048 : 0.40 handshake/s
ECDSA-secp256r1 : 8.67 sign/s
ECDSA-secp256r1 : 4.67 verify/s
ECDHE-secp256r1 : 4.67 handshake/s
ECDH-secp256r1 : 9.00 handshake/s
図4 パフォーマンス比較
ほとんどの実装項目は、QSPIが66MHzのDDRモードで動作しているときに最悪のパフォーマンスを示すことがわかります。
Coremarkデモ
2番目のデモは、上記の3つの条件下でCoremarkデモを実行しており、その結果は以下に示されています。
SDR Mode run at 100 MHz.
FlexSPI clock source is 3, FlexSPI Div is 6, PLL3 PFD0 is 720000000
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 391889200
Total time (secs): 16.328717
Iterations/Sec : 2449.671999
Iterations : 40000
Compiler version : MCUXpresso IDE v11.3.1
Compiler flags : Optimization most (-O3)
Memory location : STACK
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0x25b5
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 2449.671999 / MCUXpresso IDE v11.3.1 Optimization most (-O3) / STACK
SDR Mode run at 133 MHz.
FlexSPI clock source is 3, FlexSPI Div is 4, PLL3 PFD0 is 664615368
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 391888682
Total time (secs): 16.328695
Iterations/Sec : 2449.675237
Iterations : 40000
Compiler version : MCUXpresso IDE v11.3.1
Compiler flags : Optimization most (-O3)
Memory location : STACK
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0x25b5
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 2449.675237 / MCUXpresso IDE v11.3.1 Optimization most (-O3) / STACK
DDR Mode run at 66 MHz.
FlexSPI clock source is 2, FlexSPI Div is 5, PLL3 PFD0 is 396000000
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 391890772
Total time (secs): 16.328782
Iterations/Sec : 2449.662173
Iterations : 40000
Compiler version : MCUXpresso IDE v11.3.1
Compiler flags : Optimization most (-O3)
Memory location : STACK
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0x25b5
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 2449.662173 / MCUXpresso IDE v11.3.1 Optimization most (-O3) / STACK
CoreMarkスコアを比較した後、QSPIが66 MHzのDDRモードで動作しているときに、CoreMarkスコアが最も低くなります。しかし、実際にはかなり近いです。
上記の2つのテストから、少なくともi.MX RT10xxシリーズMCUにおいて、DDRモードはおそらく最良の選択肢ではないことがわかります。
i.MXRT 102倍 i.MXRT 105倍 i.MXRT 106倍
記事全体を表示