L言語

hyousi.jpg(2670 byte) hajimeni.jpg(2838 byte) seltukeihouhou.jpg(3001 byte) tsukaikata.jpg(2731 byte) seltukeikankyou.jpg(3031 byte) bunpou.jpg(2505 byte) kinoujiltukou_m.jpg(3361 byte) ronrialtusyuku.jpg(3033 byte) haifu.jpg(2514 byte)

        目次

 ●機能実行
 ◎概要
 ◎書き方と使い方
 ◎LSIM以外での使い方
 ○実効譜と機能実行譜
 ○テストベンチ

 

機能実行

機能実行は素子の遅延を考慮しない機能シミュレーシ ョンにあたりますが、方法が従来のテストベンチと違 いますので概要で説明します。
機能実行譜の書き方は固有のものもありますが、基本 的に論理設計なので実効譜と同じ文法で書きます。

modoru.jpg(1480 byte)  

概要

L言語は LTOOL で提供される論理設計プログラム群で 開発を行います。 これはコンパイラ、シミュレータ、ビューワの3種類 のプログラムから成っています。 この中でシミュレータとビューワの開発を先に行いま した、コンパイラは最後に完成しました。

シミュレータとビューワは L言語ではない言語の出力 していた論理式をシミュレーションして閲覧するため に開発を始めたのですが、完成してみると設計したロ ジックにデータを供給して駆動する方法が従来のテス トベンチでもシミュレータの画面から直接入力する方 法でも大規模な設計には使えないことが分かりました 。

そこでロジックを論理設計して作るように 検証データ もロジックで作らせたらどうかと考えたわけです。 さらに進めて、設計したロジックと検証するロジック をひとつにして駆動したらシミュレータ上でクロック を与えるだけで設計ロジックの振る舞いが観察できる と分かりました。

この方法ならテストベンチに設計ロジックと検証ロジ ックのひとつになったものを指定してクロックを与え るだけですから、他の言語の開発環境でも同様のシミ ュレーションをさせることができます。

modoru.jpg(1480 byte)  

書き方と使い方

機能実行譜をつけた論理譜は下のように書きます。


{ =============================================== }
{     論理譜                                      }
{ =============================================== }

logicname sample


{ ----------------------------------------------- }
{     手続き譜                                    }
{ ----------------------------------------------- }

procedure add
input  a[4];
input  b[4];
output c[4];

   c=a+b;
endp


{ ----------------------------------------------- }
{     実効譜                                      }
{ ----------------------------------------------- }

entity main
input  a[4],b[4];
output c[4];

   c=add(a,b);
ende


{ ----------------------------------------------- }
{     機能実行譜                                  }
{ ----------------------------------------------- }

entity sim   {機能実行譜は sim の名前にします。}
output a[4],b[4];
output c[4];
bitr   tc[5];

   part main(a,b,c)   {実効譜の引用}

   tc=tc+1;

   switch(tc)
      case 5:  a=1; b=2;
      case 6:  a=2; b=3;
      case 7:  a=3; b=4;
      case 8:  a=4; b=5;
      case 9:  a=5; b=6;
      case 10: a=6; b=7;
   endswitch

ende
endlogic

コマンド     LSIM .LBL

  1. LDC sample -ls  
  2. SIM t1.sim
  3. VIEW
 c.3-0
 b.3-0
 a.3-0

上の LSIM .LBL を使ってコマンドを実行して得られ た結果が下です。



modoru.jpg(1480 byte)  

LSIM以外での使い方

LSIM以外のシミュレータで検証する場合は下のように 書いておきます。 初期化されない記憶信号は simres で同様の条件付け をした方が良いでしょう。 LSIMと共用はできませんが simres=0 を入れるとLSIM でも使えます。

entity sim
output a[4],b[4];
output c[4];
bitr   tc[5];
input  simres;   {追加}

   { simres=0 }  {注釈を外すとLSIMでも使えます。} 
   part main(a,b,c)
   if (!simres) tc=tc+1; endif   {条件を付ける}

   switch(tc)
      case 5:  a=1; b=2;
      case 6:  a=2; b=3;
      case 7:  a=3; b=4;
      case 8:  a=4; b=5;
      case 9:  a=5; b=6;
      case 10: a=6; b=7;
   endswitch

ende

下はコンパイラに -vh オプションを指定して VHDL のファイルを出力させたものです。

modoru.jpg(1480 byte)  

実効譜と機能実行譜

実効譜の e0.vhd はチップ化に使います。 機能実行譜の e1.vhd とテストベンチの s1.vhd でチップ化する設計環境のシミュレータで機能検証で きます。

実効譜 e0.vhd  機能実行譜 e1.vhd
library IEEE;

use IEEE.std_logic_1164.all;

entity main is

   port(a0 : in    std_logic;
        b0 : in    std_logic;
        a1 : in    std_logic;
        b1 : in    std_logic;
        a2 : in    std_logic;
        b2 : in    std_logic;
        c0 : out   std_logic;
        c1 : out   std_logic;
        c2 : out   std_logic;
        c3 : out   std_logic;
        a3 : in    std_logic;
        b3 : in    std_logic);

end main;

architecture RTL of main is
signal n_n18 : std_logic ;
signal n_n19 : std_logic ;
signal n_n20 : std_logic ;

begin

n_n18 <= (a0 and b0) ;

n_n19 <= (not a1 and b1 and a0 and b0)
   or (a1 and not b1 and a0 and b0)
   or (a1 and b1) ;

n_n20 <= (not a2 and b2 and n_n19)
   or (a2 and not b2 and n_n19)
   or (a2 and b2) ;

c0 <= (not a0 and b0)
   or (a0 and not b0) ;

c1 <= (not a1 and not b1 and a0 and b0) 
   or (not a1 and b1 and not n_n18)
   or (a1 and not b1 and not n_n18)
   or (a1 and b1 and a0 and b0) ;

c2 <= (not a2 and not b2 and n_n19)
   or (not a2 and b2 and not n_n19)
   or (a2 and not b2 and not n_n19)
   or (a2 and b2 and n_n19) ;

c3 <= (not a3 and not b3 and n_n20)
   or (not a3 and b3 and not n_n20)
   or (a3 and not b3 and not n_n20)
   or (a3 and b3 and n_n20) ;

end RTL;
library IEEE;

use IEEE.std_logic_1164.all;

entity sim is

   port(clk     : in    std_logic;   ← クロック
        sim_a0  : out   std_logic;
        sim_b0  : out   std_logic;
        sim_a1  : out   std_logic;
        sim_b1  : out   std_logic;
        sim_a2  : out   std_logic;
        sim_b2  : out   std_logic;
        sim_c0  : out   std_logic;
        sim_c1  : out   std_logic;
        sim_c2  : out   std_logic;
        sim_c3  : out   std_logic;
        sim_a3  : out   std_logic;
        sim_b3  : out   std_logic;
        simres0 : in    std_logic);   ← 初期化

end sim;

architecture RTL of sim is
signal n_n40 : std_logic ;
signal n_n41 : std_logic ;
signal n_n42 : std_logic ;
signal n_n43 : std_logic ;
signal n_n44 : std_logic ;
signal n_n18 : std_logic ;
signal n_n19 : std_logic ;
signal n_n20 : std_logic ;
signal n_n54 : std_logic ;
signal n_n55 : std_logic ;
signal n_n56 : std_logic ;
signal a0    : std_logic ;
signal b0    : std_logic ;
signal a1    : std_logic ;
signal b1    : std_logic ;
signal a2    : std_logic ;
signal b2    : std_logic ;
signal c0    : std_logic ;
signal c1    : std_logic ;
signal c2    : std_logic ;
signal c3    : std_logic ;
signal a3    : std_logic ;
signal b3    : std_logic ;

begin

process(clk) begin
   if (clk' event and clk='1') then

      n_n40 <= (not n_n40 and not simres0) ;

      n_n41 <= (not n_n41 and n_n40 and not simres0)
         or (n_n41 and not n_n40 and not simres0) ;

      n_n42 <= (not n_n42 and n_n41 and n_n40 and not simres0)
         or (n_n42 and not simres0 and not n_n54) ;

      n_n43 <= (not n_n43 and n_n42 and n_n41 and n_n40 and not simres0)
         or (n_n43 and not simres0 and not n_n55) ;

      n_n44 <= (not n_n44 and n_n43 and n_n42 and n_n41 and n_n40 and not simres0) 
         or (n_n44 and not simres0 and not n_n56) ;

   end if;
end process;

n_n18 <= (a0 and b0) ;   ← 実効譜

n_n19 <= (not a1 and b1 and a0 and b0)
   or (a1 and not b1 and a0 and b0)
   or (a1 and b1) ;

n_n20 <= (not a2 and b2 and n_n19)
   or (a2 and not b2 and n_n19)
   or (a2 and b2) ;

c0 <= (not a0 and b0)
   or (a0 and not b0) ;

c1 <= (not a1 and not b1 and a0 and b0)
   or (not a1 and b1 and not n_n18)
   or (a1 and not b1 and not n_n18)
   or (a1 and b1 and a0 and b0) ;

c2 <= (not a2 and not b2 and n_n19)
   or (not a2 and b2 and not n_n19)
   or (a2 and not b2 and not n_n19)
   or (a2 and b2 and n_n19) ;

c3 <= (not a3 and not b3 and n_n20)
   or (not a3 and b3 and not n_n20)
   or (a3 and not b3 and not n_n20)
   or (a3 and b3 and n_n20) ;

n_n54 <= (n_n41 and n_n40 and not simres0) ;

n_n55 <= (n_n42 and n_n41 and n_n40 and not simres0) ;

n_n56 <= (n_n43 and n_n42 and n_n41 and n_n40 and not simres0) ;

a0 <= (n_n40 and not n_n41 and not n_n42 and n_n43 and not n_n44) ← 検証データ
   or (n_n40 and n_n42 and not n_n43 and not n_n44) ;

a1 <= (not n_n40 and n_n41 and not n_n42 and n_n43 and not n_n44)
   or (n_n41 and n_n42 and not n_n43 and not n_n44) ;

a2 <= (not n_n41 and not n_n42 and n_n43 and not n_n44)
   or (not n_n42 and n_n43 and not n_n44 and not n_n40) ;

a3 <= ('0') ;

b0 <= (not n_n40 and n_n41 and n_n42 and not n_n43 and not n_n44)
   or (not n_n40 and not n_n42 and n_n43 and not n_n44) ;

b1 <= (n_n40 and not n_n41 and n_n42 and not n_n43 and not n_n44)
   or (not n_n40 and n_n41 and n_n42 and not n_n43 and not n_n44)
   or (n_n40 and not n_n41 and not n_n42 and n_n43 and not n_n44)
   or (not n_n40 and n_n41 and not n_n42 and n_n43 and not n_n44) ; 

b2 <= (n_n40 and n_n41 and n_n42 and not n_n43 and not n_n44)
   or (not n_n41 and not n_n42 and n_n43 and not n_n44)
   or (not n_n40 and not n_n42 and n_n43 and not n_n44) ;

b3 <= ('0') ;


sim_a0 <= a0 ;   ← 閲覧信号
sim_b0 <= b0 ;
sim_a1 <= a1 ;
sim_b1 <= b1 ;
sim_a2 <= a2 ;
sim_b2 <= b2 ;
sim_c0 <= c0 ;
sim_c1 <= c1 ;
sim_c2 <= c2 ;
sim_c3 <= c3 ;
sim_a3 <= a3 ;
sim_b3 <= b3 ;

end RTL;


modoru.jpg(1480 byte)  

テストベンチ

テストベンチ s1.vhd は機能実行譜 e1.vhd に対して用います。 機能実行譜があるときに VHDL Verilog ABEL の出力 を指定したときはテストベンチも作られます。
テストベンチのステップ数はコンパイラのオプション で指定できます、 500 ステップにしたいときは -sp 500 とします。

テストベンチ s1.vhd
library IEEE;

use IEEE.std_logic_1164.all;

entity TESTBENCH is
end TESTBENCH ;

architecture  behavior of TESTBENCH is 

   component sim   ← 機能実行譜を引用します。
   port(clk     : in    std_logic;
        sim_a0  : out   std_logic;
        sim_b0  : out   std_logic;
        sim_a1  : out   std_logic;
        sim_b1  : out   std_logic;
        sim_a2  : out   std_logic;
        sim_b2  : out   std_logic;
        sim_c0  : out   std_logic;
        sim_c1  : out   std_logic;
        sim_c2  : out   std_logic;
        sim_c3  : out   std_logic;
        sim_a3  : out   std_logic;
        sim_b3  : out   std_logic;
        simres0 : in    std_logic);
   end component ;

constant CLK_CYCLE : Time := 20 ns ;

signal clk     : std_logic ;
signal simres0 : std_logic ;
signal sim_a0  : std_logic ;
signal sim_b0  : std_logic ;
signal sim_a1  : std_logic ;
signal sim_b1  : std_logic ;
signal sim_a2  : std_logic ;
signal sim_b2  : std_logic ;
signal sim_c0  : std_logic ;
signal sim_c1  : std_logic ;
signal sim_c2  : std_logic ;
signal sim_c3  : std_logic ;
signal sim_a3  : std_logic ;
signal sim_b3  : std_logic ;

begin

   unit : sim port map (
      clk => clk,
      sim_a0 => sim_a0,
      sim_b0 => sim_b0,
      sim_a1 => sim_a1,
      sim_b1 => sim_b1,
      sim_a2 => sim_a2,
      sim_b2 => sim_b2,
      sim_c0 => sim_c0,
      sim_c1 => sim_c1,
      sim_c2 => sim_c2,
      sim_c3 => sim_c3,
      sim_a3 => sim_a3,
      sim_b3 => sim_b3,
      simres0 => simres0);

   process begin
      clk <= '1';
      wait for CLK_CYCLE/2;
      clk <= '0';
      wait for CLK_CYCLE/2;
   end process;

   process begin
      simres0 <= '0';
      wait for CLK_CYCLE*2;
      simres0 <= '1';
      wait for CLK_CYCLE*5;   ← 5クロック simres を 1 にする。
      simres0 <= '0';
      wait for CLK_CYCLE*30;  ← 30クロック 供給する。 
   end process;
end;


modoru.jpg(1480 byte)