スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[VHDL][検証] OSVVM Release 2014.01

Open Source VHDL Verification Methodology(OSVVM)
2014.01がリリースされたようです。

MessagePkgが分かれたようで、コンパイル順に気をつけないといけないようです。

  • 引用

Message handling is now handled by separate package, MessagePkg. MessagePkg must be compiled before CoveragePkg. Suggested compile order:

MessagePkg.vhd
SortListPkg_int.vhd
RandomBasePkg.vhd
RandomPkg.vhd
CoveragePkg.vhd

スポンサーサイト

[VHDL][OVL] Quick start OVL(VHDL) - ModelSim

VerificationOnWebにて、


Quick start on ABV for VHDL designers – OVL + VHDL + Modelsim


実際にダウンロードしてきて、

$> cd run_dir 
$> make ovl

で、ModelSim-ASEでも動作はします。が。
shift_reg.vhdlみると・・・


とりあえず、OVLのコンパイル。
デザインへの適用ってことで参考にはなるかな・・・(汗

[VHDL-2008] 端数とsign/unsignの代入

VHDL-2008, The End of Verbosity!

を見ていて自分でも試してみました。(p17)


VHDL-2008以前だと、4bit単位でしか16進数表記で書けませんでした。
しかし、VHDL-2008では Verilog HDLのように前に bit幅を指定でき、
任意のbitの代入が可能です。

  • サンプルコード

  •  1|library IEEE;
     2|use IEEE.std_logic_1164.all;
     3|use IEEE.std_logic_unsigned.all;
     4|use IEEE.numeric_std.all;
     5|use IEEE.std_logic_textio.all;
     6|use std.textio.all;
     7|
     8|entity testbench is
     9|end testbench;
    10|
    11|architecture SIM of testbench is
    12|
    13|signal s_a   : std_logic_vector(6 downto 0) := (others=>'0');
    14|
    15|begin
    16|
    17|  process
    18|    variable L : line;
    19|  begin
    20|    s_a <= "1001000";
    21|      wait for 10ns;
    22|    s_a <= 7X"7F"; -- "1111111"
    23|      wait for 10ns;
    24|
    25|    s_a <= 7UX"F" ; -- "0001111"
    26|      wait for 10ns;
    27|    s_a <= 7UX"0F"; -- "0001111"
    28|      wait for 10ns;
    29|
    30|    s_a <= 7SX"F" ; -- "1111111"
    31|      wait for 10ns;
    32|    s_a <= 7SX"CF"; -- "1001111"
    33|
    34|    wait;
    35|  end process;
    36|
    37|  process(s_a)
    38|    variable L : line;
    39|  begin
    40|    write(L, "s_a = " & to_string(s_a));
    41|    writeline(output, L);
    42|  end process;
    43|
    44|end SIM;
      • 実行結果

      • # s_a = 0000000
        # s_a = 1001000
        # s_a = 1111111
        # s_a = 0001111
        # s_a = 1111111
        # s_a = 1001111
        

[VHDL-2008] to_string

VHDL-2008, The End of Verbosity!

を見ていて自分でも試してみました。(p14)


先ずはサンプルコードを見てもらったほうが早いと思います。


  • サンプルコード

  •  1|library IEEE;
     2|use IEEE.std_logic_1164.all;
     3|use IEEE.std_logic_unsigned.all;
     4|use IEEE.numeric_std.all;
     5|use IEEE.std_logic_textio.all;
     6|use std.textio.all;
     7|
     8|entity testbench is
     9|end testbench;
    10|
    11|architecture SIM of testbench is
    12|
    13|signal s_a   : std_logic_vector(7 downto 0);
    14|signal s_xor : std_logic;
    15|
    16|begin
    17|
    18|  process
    19|    variable L : line;
    20|  begin
    21|    s_a <= (others=>'0');
    22|    wait for 100 ns;
    23|    -- write(L, string'("s_a = 0 -> s_xor = "));
    24|    -- write(L, s_xor);
    25|    write(L, "s_a = " & to_string(s_a) & " -> s_xor = " & to_string(s_xor));
    26|    writeline(output, L);
    27|
    28|    s_a <= "01001000";
    29|    wait for 100 ns;
    30|    -- write(L, string'("s_a = b01001000 -> s_xor = "));
    31|    -- write(L, s_xor);
    32|    write(L, "s_a = " & to_string(s_a) & " -> s_xor = " & to_string(s_xor));
    33|    writeline(output, L);
    34|
    35|    s_a <= "11110111";
    36|    wait for 100 ns;
    37|    -- write(L, string'("s_a = b11110111 -> s_xor = "));
    38|    -- write(L, s_xor);
    39|    write(L, "s_a = " & to_string(s_a) & " -> s_xor = " & to_string(s_xor));
    40|    writeline(output, L);
    41|
    42|    wait;
    43|  end process;
    44|
    45|  s_xor <= xor s_a; -- s_xor(7) or s_xor(6) or ...
    46|
    47|end SIM;
  • 実行結果

# s_a = 00000000 -> s_xor = 0
# s_a = 01001000 -> s_xor = 0
# s_a = 11110111 -> s_xor = 1


コードでコメントアウトしている部分が今まで書いていた記述になります。
しかし、to_string を使えることでよりシンプルに記述することが出来ます。
更に to_hsringto_ostring もあります。


ちなみに -2008を付けないと以下のようなエラーが出ました。

** Error: test.vhd|25| (vcom-1136) Unknown identifier "to_string".
** Error: test.vhd|25| Bad expression in left operand of infix expression "&".
** Error: test.vhd|25| Bad expression in left operand of infix expression "&".
** Error: test.vhd|25| (vcom-1136) Unknown identifier "to_string".
** Error: test.vhd|25| No feasible entries for subprogram "write".
** Error: test.vhd|32| (vcom-1136) Unknown identifier "to_string".
** Error: test.vhd|32| Bad expression in left operand of infix expression "&".
** Error: test.vhd|32| Bad expression in left operand of infix expression "&".
** Error: test.vhd|32| (vcom-1136) Unknown identifier "to_string".
** Error: test.vhd|32| No feasible entries for subprogram "write".
** Error: test.vhd|39| (vcom-1136) Unknown identifier "to_string".
** Error: test.vhd|39| Bad expression in left operand of infix expression "&".
** Error: test.vhd|39| Bad expression in left operand of infix expression "&".
** Error: test.vhd|39| (vcom-1136) Unknown identifier "to_string".
** Error: test.vhd|39| No feasible entries for subprogram "write".
** Error: test.vhd|45| No feasible entries for prefix operator "xor".
** Error: test.vhd|45| Type error resolving prefix expression "xor" as type ieee.std_logic_1164.STD_LOGIC.
** Error: test.vhd|47| VHDL Compiler exiting

[VHDL-2008] bit_vectorと1bitの bit演算

VHDL-2008, The End of Verbosity!

を見ていて自分でも試してみました。(p11)


VHDL-2008以前だと、4bit変数 and 1bit変数だと
1bitを4bitに拡張して、演算しないとダメでしたが、
VHDL-2008だと、その部分のオペレーションが追加されています。


  • サンプルコード

  • library IEEE;
    use IEEE.std_logic_1164.all;
    use IEEE.std_logic_unsigned.all;
    use IEEE.numeric_std.all;
    use IEEE.std_logic_textio.all;
    use std.textio.all;
    
    entity testbench is
    end testbench;
    
    architecture SIM of testbench is
    
    signal s_a   : std_logic_vector(3 downto 0);
    signal s_b   : std_logic;
    signal s_val : std_logic_vector(3 downto 0);
    
    begin
    
      process
        variable L : line;
      begin
        s_a <= (others=>'0');
        s_b <= '0';
        wait for 100 ns;
        write(L, string'("s_a(=0) and s_b(=0) -> s_val = "));
        write(L, s_val);
        writeline(output, L);
    
        s_a <= "0100"; s_b <= '1';
        wait for 100 ns;
        write(L, string'("s_a(=b0100) and s_b(=1) -> s_val = "));
        write(L, s_val);
        writeline(output, L);
    
        s_a <= "1110";
        wait for 100 ns;
        write(L, string'("s_a(=b1110) and s_b(=1) -> s_val = "));
        write(L, s_val);
        writeline(output, L);
    
        wait;
        -- assert (false) report "Simulation End!" severity failure;
      end process;
    
      process(s_a, s_b) begin
        s_val <= s_a and s_b;
      end process;
    
    end SIM;
  • 実行結果

  • # s_a(=0) and s_b(=0) -> s_val = 0000
    # s_a(=b0100) and s_b(=1) -> s_val = 0100
    # s_a(=b1110) and s_b(=1) -> s_val = 1110
    

ちなみに -2008を付けないと以下のようなエラーが出ました。

** Error: test.vhd(46): No feasible entries for infix operator "and".
** Error: test.vhd(46): Type error resolving infix expression "and" as type
ieee.std_logic_1164.STD_LOGIC_VECTOR.
** Error: test.vhd(49): VHDL Compiler exiting
プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
08 | 2017/09 | 10
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。