CHIPA dut(
(an omission)
// SPI Flash Interface.
.SCK(SCK),
.CS(CS),
.SI(SI),
.SO(SO),
.
(an omission)
);
// A社のメモリモデル
SPIFlashA SPIFlashA(
.SCK(SCK_A),
.CS(CS_A),
.SI(SI_A),
.SO(SO_A)
);
// USE_SPI_Aが真となったら、
// CHIPのSPI FLASH IFとSPIFlashAの信号を接続
rtranif1(SCK, SCK_A, USE_SPI_A);
rtranif1(CS, CS_A, USE_SPI_A);
rtranif1(SI, SI_A, USE_SPI_A);
rtranif1(SO, SO_A, USE_SPI_A);
// B社のメモリモデル
SPIFlashB SPIFlashB(
.SCK(SCK_B),
.CS(CS_B),
.SI(SI_B),
.SO(SO_B)
);
// USE_SPI_Bが真となったら、
// CHIPのSPI FLASH IFとSPIFlashBの信号を接続
rtranif1(SCK, SCK_B, USE_SPI_B);
rtranif1(CS, CS_B, USE_SPI_B);
rtranif1(SI, SI_B, USE_SPI_B);
rtranif1(SO, SO_B, USE_SPI_B);
// C社のメモリモデル
'ifdef BENCHUSE_SPI_C
SPIFlashC SPIFlashC(
.SCK(SCK_C),
.CS(CS_C),
.SI(SI_C),
.SO(SO_C)
);
// USE_SPI_Cが真となったら、
// CHIPのSPI FLASH IFとSPIFlashCの信号を接続
rtranif1(SCK, SCK_C, USE_SPI_C);
rtranif1(CS, CS_C, USE_SPI_C);
rtranif1(SI, SI_C, USE_SPI_C);
rtranif1(SO, SO_C, USE_SPI_C);
上記にはいくつか新しい信号が出てきています。また各モデルごとの信号名をそれぞれ固有の信号名にかえています。
信号USE_SPI_A,USE_SPI_B,USE_SPI_CはRuntimeOptionで有効になる信号です。bench内では下記のように記述します。
// SPI FLASH Aを使用するためのOptionを生成。
reg USE_SPI_A='b0;
initial begin
if($test$plusargs("SPI_A"))
USE_SPI_A='b1;
end
// SPI FLASH Bを使用するためのOptionを生成。
reg USE_SPI_B='b0;
initial begin
if($test$plusargs("SPI_B"))
USE_SPI_B='b1;
end
// SPI FLASH Cを使用するためのOptionを生成。
reg USE_SPI_C='b0;
initial begin
if($test$plusargs("SPI_C"))
USE_SPI_C='b1;
end
上記のように記入しておけば、例えばSynopsysのシミュレータのVCSでは"simv +SPI_A"でUSE_SPI_A信号が1になりSPI_FLASH_Aのみと通信出来るようになります。
そのかわりbenchの記述量が増えています。検証のマネジメントの際は再compileによる時間の増加、ディスクの使用量の増加、benchの作業の作業など状況をみて最適な方法の選択について検討します。私が関わった中でもARM7を1個搭載の簡単なシステムの場合はCompileスイッチによる切り替えを選択した事があります。
ちなみに検証環境説明書には"+SPI_A"と"+SPI_B"と"+SPI_C"は同時に指定しないでくださいとの文言は入れておきましょう(^^!。
私が現役時代にも同時に複数指定して「Bugだ〜」と騒いでいた輩が稀に居ましたので。
ここでもうひとつrtranif*をつかっていますが、これは次のページで説明します。