ＶＨＤＬ −３

VHDL- ４
この文書の目的
前回の VHDL-3 ではメモリーを「実デバイスへの実装」する時の注意点についての説明をしてみました。

今回は、再び Vsys に戻って TextIO についての説明をしてみたいと思います。
アルテラなどのシミュレータでも、ベクターを利用することは当然可能なのですが、以前にも説明したとおり、ＦＰＧＡ の外部に設置した遅延を含む要素を取り込んだ場合のシミュレーション（maxplus2 では、全ての要素をアルテラ社のデバイスとして作成すれば可能です）に対しては基本的に対応がとれません。
今回の例題では、Vsys に外部ベクターファイルを読込ませ、シミュレーションを実行してその結果をテキスト出力ファイルに吐き出すまでを説明します。
シミュレーションの過程でクロック信号にドリフトを加えていますが、Vsys での取扱いでは、このような処理が比較的自由に行える事が特徴といえそうです。

準備です
前回同様、作業用ディレクトリを作成します。
今回は d:\uoo として、添付してある mem_tb.vhd と mem_tb.vec との２つのファイルをコピーしておいて下さい。

Vsys を起動したらこのディレクトリ d:\uoo に移動して、プロジェクト・ファ
イル vsystem.ini を作成してから、前の例題のように作業ディレクトリ work を設定します。（アイコンのショートカットのプロパティを編集して、作業フォルダにd:\uoo を指定しておくと、何回も起動してテストを繰り返すときには少しだけ楽ができます）参考までに、私の場合の vsystem.ini 内容の一部を下に示します。

[library]
std = c:/vsystem/std
IEEE = c:/vsystem/ieee
SIMPRIM = D:/xilinx/vhdl/src/simprims/work
ALT_VTL = C:/MAXPLUS2/VHDL87/VITAL/V3_0/WORK[vcom]
Keep Dialog Open=1
Show_source = true
Explicit = false
VHDL93 = false
以下略
Systems Workshop Inc.

1998/8/ ４ 1

ＶＨＤＬ −３

Ｖsim での取り扱いについて殆ど何も新しい説明はありませんが、作業ディレクトリ名がもし正確に d:\uooとなっていない場合は、ソースに変更を加える（読込みベクター・ファイルをフルパス名で指定している為です）必要があります。

このような場合には、ソースファイルの 130,132 行目を、適切なディレクトリ名に変更して下さい。

いつものようにサンプルファイル mem_tb.vhd を VCOM します。
次に、VSIM ボタンを押すと、今回の例題ではデザインファイルが２つ、エンティティとしてコンパイルされている事が判ります。

この内容は被試験物のram と、その試験環境 testbench の２つですので、テストベンチ の方を選んでアーキテクチャ testmain を指定し add して ok して下さい。
トランスクリプト画面で（別に表示されていなくても構わないのですが）view wave
wave *としてから

run -allで、タイミングのドリフトを持ったクロックによってメモリがテストされている事が波形表示されます。 このドリフト操作はソースファイルの 行 165 で処理された結果です。

vsim する時に、前の例題のように "add" してからジェネリックを vhdl メニューで変更していないのに、シミュレーション中に警告がでていますが、これはソースファイルの７３行目で発行されたメッセージです。

Vsys を終了し、ファイルのロックを外してから、 d:\uoo ディレクトリの内容を見ると、新しい mem_tb.out という名前のファイルが作成されている事が判ります。

これは、mem_tb.vhd ソースファイルの 行 183..190 出力文で作成されたテキストファイルですので、適切なエディタで開いてみてください。

まとめ
市販の書籍の参考例題は、必ずしもそのままでは vsim できない場合があります
が、特に textio を使用した場合に多いのではないかと思いますので、今回の例題でどのように引数を渡しているかを見て参考にしてください。

Systems Workshop Inc.

1998/8/ ４ 1

d:\uoo\mem_tb.vhd

151015-------------------------------------------------------------------------------- VHDL-4
TextIO step for Vsystem
1998/8/5 Systems Workshop Inc.
-- ----------------------------------------------------------------------- ----Please be noticed that, if you have installed Vsystem/VHDL into your PC,-- you will find that several examples described in Tutorial books does’t work-- at all.
It is especially true when you have experimented with textio-- applications.
--- Here described is a simple example for Vsytem applications. After you have-- got well experienced, it will become much easier to overload those library-- dependent in-compatibleness.
--Please find a TEXTIO.VHD in /Vsystem/vhdl_src/std/ directry and a package-- STD_LOGIC_TEXTIO in textio.vhd at your /Vsystem/vhdl_src/synopsys/ also.
--------------------------------------------------------------------------------- TARGET DESIGN------------------------------------------------------------------------------use std.standard.all;20
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;25

30

Entity Ram isGeneric( INSTANCE_ID: string ;adr_bits: integer;
data_bits : integer );port(Adr_in:in Std_Logic_vector( adr_bits-1 downto 0);
DIN:in Std_Logic_vector(data_bits-1 downto 0);
DOUT:out Std_Logic_vector(data_bits-1 downto 0);
CS:in Std_Logic;nWRITE:in Std_Logic);

35
constant nwords :integer := 2 **adr_bits;
subtype word is Std_Logic_vector(data_bits-1 downto 0);
type ram_type is array(0 to nwords-1)of word;
40

End;

45

------------------------------------------------------------------------------Architecture RTL of Ram is------------------------------------------------------------------------------BEGIN------------------------------------------------------------------------------RamUnit:Process (CS)------------------------------------------------------------------------------variable RamArray : ram_type;50
variable address : integer;
variable cs_rise,cs_fall, cs_width: TIME :=0 ns;
55

60

65

Begin
if rising_edge(CS) thencs_rise := NOW;
address := conv_integer (Adr_in);
if (nWRITE =’0’ and CS=’1’) thenRamArray(address):=DIN;
end if;if(nWRITE=’1’ and CS=’1’) then
DOUT <= RamArray(address) after 3 ns;
else
DOUT <= "ZZZZZZZZ";
end if;
End if;if falling_edge(CS) thencs_fall := NOW;
end if;d:\uoo\mem_tb.vhd

70
cs_width :=(cs_fall - cs_rise);75

Assert not (CS=’0’ and (cs_rise /= 0 ns) and (cs_width > 48 nS ))report "cs_pulse width " & "@" & INSTANCE_ID
severity WARNING;
end Process RamUnit;
End RTL;-------------------------------------------------------------------------------80

859095100105110-------------------------------------------------------------------------------- TEST BENCH EX2------------------------------------------------------------------------------use std.textio.all;library IEEE;
use IEEE.std_logic_1164.all;use ieee.std_logic_ARITH.all ;use ieee.std_logic_unsigned.all ;use ieee.std_logic_textio.all;------------------------------------------------------------------------------Entity TestBench isGeneric(clocktic : time:=5 ns);end;------------------------------------------------------------------------------------------------------------------------------------------------------------Architecture TestMain of TestBench is------------------------------------------------------------------------------Component Ram-- This is the TARGET design decraration in testbench.
Generic( INSTANCE_ID : string;
adr_bits: integer ;data_bits: integer );Port(Adr_in :in Std_Logic_vector( adr_bits-1 downto 0);
DIN:in Std_Logic_vector(data_bits-1 downto 0);
DOUT:out Std_Logic_vector(data_bits-1 downto 0);
CS:in Std_Logic;nWRITE :in Std_Logic);end Component;-- Internal signals for Test-Bench operations -----------------------------

115

signal CLK
signal CLKCS
signal tnWRITE
signal tAdr_In
signal tDIN
signal tDRO

: Std_Logic;: Std_Logic :=’0’; -- If not initialized,see what happens.
: Std_Logic ;: Std_Logic_Vector(7 downto 0);: Std_Logic_Vector(7 downto 0);: Std_Logic_Vector(7 downto 0);120
signal
CLKCOUNT : INTEGER:= 0; -- CLOCK counter to increment INDEX value.
constant MAXCOUNT : INTEGER:= 3; -- for Patern-Gen repeat count value
125

130

Type VectRecord is Record-- TestVector format definition.
Adr : Std_Logic_vector(7 downto 0);-- For Z/U char in text file
Din : Std_Logic_vector(7 downto 0);nW : Std_Logic;
End Record;File TestPatFile : TEXT is in "d:\uoo\Mem_Tb.vec";-- Drive vector.

File TestDroFile : TEXT is out "d:\uoo\Mem_Tb.out";-- Logging output.

------------------------------------------------------------------------------135

Begin-- Test Bench MAIN. Connect target entity with test vector signals -------------------------------------------------------------------------------------------------------------------------------------------------------------d:\uoo\mem_tb.vhd

140

145

150

155

160

165

UUT: Ram-----------------------------------------------------------------------------Generic Map(
INSTANCE_ID =>"MyRamModel-2",
adr_bits => 8 ,data_bits => 8)
PORT Map(
Adr_in => tAdr_In, -- Connect test vector signals to the target.
DIN=> tDIN,
DOUT=> tDRO,CS=> CLKCS,nWRITE => tnWRITE);------------------------------------------------------------------------------Process------------------------------------------------------------------------------variable CLI,CLO : Line ;-- TextIO Line.
variable CV : VectRecord;-- Current Vector.
variable Drift,Clocktime: Time;--------------------------------------------------------------------------Begin
Clocktime := Clocktic;
Drift :=1 ns;
Tbloop:loop
Clocktime:=Clocktime+Drift;
CLK<=’0’;

wait for Clocktime ;-- When you used a "wait for"

CLK<=’1’;

wait for Clocktime; --you can’t use "CLK’EVENT" any more.

if(CLKCOUNT=MAXCOUNT) then
CLKCS<=’1’;
CLKCOUNT<= 0;
ReadLine( TestPatFile, CLI );Read( CLI, CV.Adr );-- Direct connection from file to "signa

170l"
175

180

185

190

Read( CLI, CV.Din );Read( CLI, CV.nW );tAdr_In <= CV.Adr;
tDIN<= CV.Din;
tnWRITE <= CV.nW;-- is not allowed. (must be a variable)

else
CLKCS<=’0’;
CLKCOUNT<=CLKCOUNT+1;
write(CLO,NOW,RIGHT,8,ns);
write(CLO,’>’,RIGHT,1);
write(CLO,to_bitvector(tAdr_In),RIGHT,10);
write(CLO,tDIN,RIGHT,10);
write(CLO,to_bit(tnWRITE),RIGHT,4);
write(CLO,’:’,RIGHT,1);
write(CLO,tDRO,RIGHT,10);
writeline( TestDroFile,CLO );-- Here you have wrote a new line.
end if;exit when ENDFILE(TestPatFile );195
end loop Tbloop;

200

assert False
report "File End "severity Error;
end process;---------------------------------------------------------------------------

d:\uoo\mem_tb.vhd

205

END;
-------------------------------------------------------------------------------

d:\uoo\mem_tb.vec

15101500000000 00000001 000000001 00000010 000000010 00000100 000000011 00001000 000000100 00010001 000000101 00100011 000000110 01000111 000000111 10001111 000000000 ZZZZZZZZ 100000001 ZZZZZZZZ 100000010 ZZZZZZZZ 100000011 ZZZZZZZZ 100000100 ZZZZZZZZ 100000101 ZZZZZZZZ 100000110 ZZZZZZZZ 100000111 ZZZZZZZZ 1

d:\uoo\mem_tb.out

1

51015

12 ns>
26 ns>
42 ns>
80 ns>
102 ns>126 ns>180 ns>210 ns>242 ns>
312 ns>
350 ns>390 ns>
476 ns>522 ns>
570 ns>672 ns>00000000
00000000
00000000
00000000
00000000
00000000
00000001
00000001
00000001
00000010
00000010
00000010
00000011
00000011
00000011
00000100UUUUUUUUUUUUUUUUUUUUUUUU
00000001
00000001
00000001
00000010
00000010
00000010
00000100
00000100
00000100
00001000
00001000
00001000
00010001

0:
0:
0:
0:
0:
0:
0:
0:
0:
0:
0:
0:0:0:0:0:

UUUUUUUUUUUUUUUUUUUUUUUUZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ