Симулятор GHDL: numeric_std-body.v93: NUMERIC_STD. "=": Обнаружен нулевой аргумент, возвращается FALSE - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь смоделировать свой код VHDL с помощью симулятора GHDL, и симулятор выдает много предупреждающих сообщений из библиотеки "numeric_std", я пытался вспомнить, что вызывает эти ошибки и как предотвратить их появление в симуляторе GHDL. Можно ли изменить код, чтобы предотвратить их, добавить флаг симулятора или добавить прагму в код? :

numeric_std-body.v93:1605:7:@0ms:(assertion warning): NUMERIC_STD."=": null argument detected, returning FALSE

Windows Run Script:

..\simtools\ghdl\bin\ghdl.exe -a bus_fifo_mem.vhdl
..\simtools\ghdl\bin\ghdl.exe -a bus_fifo.vhdl
..\simtools\ghdl\bin\ghdl.exe -e bus_fifo
..\simtools\ghdl\bin\ghdl.exe -r bus_fifo

numeric_std-body.v93:1605:7:@0ms:(assertion warning): NUMERIC_STD."=": null argument detected, returning FALSE

library ieee;
use ieee.std_logic_1164.all;
use IEEE.numeric_std.all;

entity bus_fifo is
    generic(
        DEPTH_WIDTH               : integer := 0;
        DATA_WIDTH                : integer := 0
    );
    port(
        clk         : in    std_logic;
        rst         : in    std_logic;
        wr_data_i   : in    std_logic_vector(DATA_WIDTH-1 downto 0);
        wr_en_i     : in    std_logic;
        rd_data_o   : out   std_logic_vector(DATA_WIDTH-1 downto 0);
        rd_en_i     : in    std_logic;
        full_o      : out   std_logic;
        empty_o     : out   std_logic        
    );
end entity;
architecture rtl of bus_fifo is
    constant   DW                        : integer := DATA_WIDTH;
    constant   AW                        : integer := DEPTH_WIDTH;
    signal     write_pointer             : unsigned(AW downto 0);
    signal     read_pointer              : unsigned(AW downto 0);
    signal     empty_int                 : std_logic;
    signal     full_or_empty             : std_logic;
begin

    process(write_pointer, read_pointer)
    begin
        if (write_pointer(AW) = read_pointer(AW)) then
            empty_int <= '1';
        else 
            empty_int <= '0';
        end if;
    end process;


    process(write_pointer, read_pointer)
    begin
        if (write_pointer(AW-1 downto 0) = read_pointer(AW-1 downto 0)) then
            full_or_empty <= '1';
        else 
            full_or_empty <= '0';
        end if;
    end process;

    full_o  <= full_or_empty and not empty_int;
    empty_o <= full_or_empty and empty_int;

    process(clk)
    begin   
        if (wr_en_i = '1') then
            write_pointer <= write_pointer + 1;
        end if;

        if (rd_en_i = '1') then
            read_pointer <= read_pointer + 1;
        end if;

        if (rst = '1') then
            read_pointer  <= (others => '0');
            write_pointer <= (others => '0');
        end if;
    end process;

    bus_fifo_mem: entity work.bus_fifo_mem
        generic map(
            ADDR_WIDTH    => AW,
            DATA_WIDTH    => DW,
            ENABLE_BYPASS => 1
        )
        port map(
            clk         => clk,
            dout        => rd_data_o,
            raddr       => std_logic_vector(read_pointer(AW-1 downto 0)),
            re          => rd_en_i,
            waddr       => std_logic_vector(write_pointer(AW-1 downto 0)),
            we          => wr_en_i,
            din         => wr_data_i
        );

end architecture;


library ieee;
use ieee.std_logic_1164.all;
use IEEE.numeric_std.all;

entity bus_fifo_mem is
    generic(
        ADDR_WIDTH     : integer := 32;
        DATA_WIDTH     : integer := 32;
        ENABLE_BYPASS  : integer := 1
    );
    port(
        clk    : in    std_logic;
        raddr  : in    std_logic_vector(ADDR_WIDTH-1 downto 0);
        re     : in    std_logic;
        waddr  : in    std_logic_vector(ADDR_WIDTH-1 downto 0);
        we     : in    std_logic;
        din    : in    std_logic_vector(DATA_WIDTH-1 downto 0);
        dout   : out   std_logic_vector(DATA_WIDTH-1 downto 0)        
    );
end entity;

architecture rtl of bus_fifo_mem is
    signal     rdata  : std_logic_vector(DATA_WIDTH-1 downto 0);
    signal     din_r  : std_logic_vector(DATA_WIDTH-1 downto 0);
    signal     bypass : std_logic;

    -- VERILOG
    --reg [DATA_WIDTH-1:0] mem[(1<<ADDR_WIDTH)-1:0];

    type mem_type is array (integer'(2) ** ADDR_WIDTH - 1 downto 0) 
          of std_logic_vector(DATA_WIDTH-1 downto 0);

    signal mem : mem_type := (others => (others => '0'));

begin

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

        if (we = '1') then
            mem(to_integer(unsigned(waddr))) <= din;
        end if;

        if (re = '1') then
           rdata <= mem(to_integer(unsigned(raddr)));
        end if;

    end if;
end process;


end architecture;

Ответы [ 3 ]

0 голосов
/ 30 апреля 2019

Для симулятора GHDL см. --Run-help:

.. option :: --ieee-asserts <= POLICY>

Выберите способ обработки утверждений из ieee единиц,POLICY может быть enable (по умолчанию), disable, который отключает все утверждения из ieee пакетов, и disable-at-0, который отключает только в начале моделирования.

Этот параметр может быть полезен дляизбегайте утверждений от ieee.numeric_std (и других ieee пакетов).

# PowerShell Build Script
class build {
    [Void] static info1([string]$msg) {
        write-host -background DarkBlue -foreground yellow $msg
    }
    [Void] static info2([string]$msg) {
        write-host -background DarkBlue -foreground cyan $msg
    }

    [void] static read ([string]$file) {
        $GHDL="..\simtools\ghdl\bin\ghdl.exe"

        [build]::info2("")
        [build]::info2("GHDL ANALYSIS: " + $file)
        & $GHDL "-a" $file
    }

    [void] static elab ([string]$unit) {
        $GHDL="..\simtools\ghdl\bin\ghdl.exe"

        [build]::info2("")
        [build]::info2("GHDL ELAB: " + $unit)
        & $GHDL "-e" $unit
    }

    [void] static run ([string]$unit) {
        $GHDL="..\simtools\ghdl\bin\ghdl.exe"

        [build]::info2("")
        [build]::info2("GHDL RUN: " + $unit)
        & $GHDL "-r" $unit "--ieee-asserts=disable-at-0"
    }

}

# RTL Design
[build]::read("bus_fifo_mem.vhdl")
[build]::read("bus_fifo.vhdl")

[build]::elab("bus_fifo")
[build]::run("bus_fifo")
0 голосов
/ 30 апреля 2019

Для GHDL вот скрипт powershell, который предположительно отключает эти сообщения VHDL:

class build {
    [Void] static info1([string]$msg) {
        write-host -background DarkBlue -foreground yellow $msg
    }
    [Void] static info2([string]$msg) {
        write-host -background DarkBlue -foreground cyan $msg
    }

    [void] static read ([string]$file) {
        $GHDL="..\simtools\ghdl\bin\ghdl.exe"

        [build]::info2("")
        [build]::info2("GHDL ANALYSIS: " + $file)
        & $GHDL "-a" $file
        [build]::info1(" $GHDL -a " + $file)
    }

    [void] static elab ([string]$unit) {
        $GHDL="..\simtools\ghdl\bin\ghdl.exe"

        [build]::info2("")
        [build]::info2("GHDL ELAB: " + $unit)
        & $GHDL "-e" $unit
        [build]::info1(" $GHDL -e " + $unit)
    }

    [void] static run ([string]$unit) {
        $GHDL="..\simtools\ghdl\bin\ghdl.exe"

        [build]::info2("")
        $cmd = "$GHDL ""-r"" $unit ""--ieee-asserts=disable-at-0"" ""--vcd=ghdl_waves.vcd"" " 
        [build]::info2("GHDL RUN: " + $unit)
        [build]::info1("$cmd")
        & $GHDL "-r" $unit "--ieee-asserts=disable-at-0" "--vcd=ghdl_waves.vcd" "--stop-time=1us" "--disp-time"
    }

}

# RTL Design
[build]::read("hello.vhdl")
[build]::elab("hello")
[build]::run("hello")
0 голосов
/ 30 апреля 2019

Не уверен, как отключить это предупреждение в симуляторе GHDL ...

Это потому, что при 0 нс я выполняю to_integer на недопустимом значении (вероятно, "UUUU"). Ожидается несколько из этих предупреждений, пока вы не сбросите свой дизайн и не укажете что-то не так. Но если вы получаете их после сброса, у вас есть проблема.

"Предупреждения могут быть подавлены. IEEE Std 1076-2008 16.8.5.2 Допустимые изменения, пункт 2 (частично) Тела пакета для пакетов NUMERIC_BIT и NUMERIC_STD объявляют константу с именем NO_WARNING, которая имеет значение FALSE. Пользователь может установить NO_WARNING для ИСТИНЫ и повторного анализа тела пакета для подавления предупреждающих сообщений, генерируемых вызовами функций в этих пакетах, или в uncomment modelsim.ini, или в качестве значения NumericStdNoWarnings = 1. Они вызваны мета-значениями, присутствующими в знаке или без знака, причем их двоичное значение равно оценивается, как правило, при инициализации. Посмотрите на ваш компонент. "

Package numeric_std is
...
end numeric_std;

Package body numeric_std is
   ...
   constant NO_WARNING : boolean := FALSE;  -- default to emit warnings
   ...
end numeric_std;

На самом деле я могу исправить это предупреждающее сообщение в коде, изменив значения по умолчанию с нуля на: (DEPTH_WIDTH: integer: = 2; DATA_WIDTH: integer: = 2), а затем проверяя, что неподписанные сигналы не являются неопределенными "x", с помощью функции «is_X (…)»… я просто не знаю, является ли следующий код синтезируемым:

    process(write_pointer, read_pointer)
    begin
        if (is_X(write_pointer) or is_X(read_pointer)) then         
            empty_int <= 'U';

        elsif (write_pointer(AW) = read_pointer(AW)) then
            empty_int <= '1';
        else 
            empty_int <= '0';
        end if;
    end process;


    process(write_pointer, read_pointer)
    begin
        if (is_X(write_pointer) or is_X(read_pointer) then          
            full_or_empty <= 'U';

        elsif (write_pointer(AW-1 downto 0) = read_pointer(AW-1 downto 0)) then
            full_or_empty <= '1';

        else 
            full_or_empty <= '0';
        end if;
    end process;
...