Modelsim / считывание значения сигнала

#vhdl #modelsim

#vhdl #modelsim

Вопрос:

В моем моделировании я хочу иметь RW-доступ к сигналам, где бы они ни были в проекте. Чтобы получить доступ на запись, я использую процедуру «signal_force» из библиотеки modelsim_lib. Но для получения доступа на чтение я не нашел соответствующую функцию.

Причина, по которой signal_force соответствует моим потребностям, заключается в том, что я работаю с входными текстовыми файлами, поэтому у меня есть имя и значение сигнала из переменной «string» или «line», и я могу напрямую передать эти переменные функции. Я не могу использовать процедуру «init_signal_spy», потому что эта процедура не возвращает значение в строку, а просто дублирует поведение сигнала на другой. Поскольку мой проект должен быть как можно более общим, я работаю с переменными, объявленными в процедурах, и я не могу связать сигнал с переменной.

Спасибо за вашу помощь

Ответ №1:

отредактировано

Извините, я выиграл награду «не очень внимательно читал» за день…

Просто для полноты я оставляю ту часть своего ответа, которая касается signal spy (который является проприетарным методом ModelSim), хотя вы сказали, что это не сработает для вас:

 library modelsim_lib;
use modelsim_lib.util.all;

architecture ...
  signal local_sig ...
begin

  process
  begin
    init_signal_spy("/sim/path/to/signal/internal_sig", "local_sig");
  

С VHDL-2008 (если у вас есть его поддержка) стандартным способом доступа к сигналам, не входящим в область видимости, являются иерархические / внешние имена, и в качестве бонуса он выполняет как «запись», так и «чтение». Возможно, я немного устал от нюансов, но вы получаете к ним доступ, как:

 <<signal .sim.path.to.signal.internal_sig : std_logic>>
  

И я полагаю, вы должны иметь возможность использовать это вместо любого обычного идентификатора в области видимости. Псевдонимы, присвоения и т.д.

Комментарии:

1. Привет, и спасибо за ваш ответ. Я не уверен, что это решение может решить мою проблему, поскольку оно использует тип «сигнал». Я чувствую, что то, что я пытаюсь сделать, невозможно в VHDL.

2. Хорошо, я думаю, я неправильно понял. Вы читаете текстовый файл, в котором указано имя сигнала, и пытаетесь получить доступ к этому имени сигнала динамически с помощью какой-либо процедуры?

3. точно. например, я могу получить доступ к сигналу для записи нового значения следующим образом: signal_force(«/tb/ dut/path/to/signal» amp; signal_name, …, signal_value); с signal_name и signal_value, определенными как string .

Ответ №2:

Если вам удобно писать код на C, должно быть легко достичь желаемого с помощью VHPI, хотя, к сожалению, несмотря на то, что он является частью стандарта VHDL, Mentor не планирует его внедрять. Однако это также будет возможно с помощью FLI, хотя вы заблокированы в проприетарном интерфейсе.

Что-то вроде этого:

 procedure get_signal_value_as_string(
    vhdl_path : IN string;
    vhdl_value: OUT string);

attribute FOREIGN of get_signal_value_as_string : procedure is “my_func mylib.so”;

procedure get_signal_value_as_string(
    vhdl_path : IN string;
    vhdl_value: OUT string) is
begin
    reportERROR: foreign subprogram get_signal_value_as_string not called”;
end;
  

Затем в C:

 #include <stdio.h>
#include "mti.h"


/* Convert a VHDL String array into a NULL terminated string */ 
static char *get_string(mtiVariableIdT id)
{
    static char buf[1000];
    mtiTypeIdT type;
    int len;
    mti_GetArrayVarValue(id, buf);
    type = mti_GetVarType(id);
    len = mti_TickLength(type);
    buf[len] = 0;
    return buf;
}


void my_func (
    mtiVariableIdT vhdl_path /* IN string */
    mtiVariableIdT vhdl_value /* OUT string */
    )
{
    mtiSignalIdT sigID = mti_FindSignal(get_string(vhdl_path));
    mtiInt32T value = mti_GetSignalValue(sigID);

    ...
}
  

Множество примеров кода в руководстве FLI.

Комментарии:

1. Привет, Чиггс, я не знал FLI, и он выглядит мощным. Знаете ли вы, возможно ли управлять сигнальным событием в FLI?

2. @grorel Я думаю, что это так, хотя и не так просто, как в VHPI, где вы можете просто зарегистрировать обратный вызов для изменения значения сигнала. Я считаю, что с помощью FLI вы можете создать процесс и настроить его на сигнал.

3. Я попробовал FLI с некоторым кодом, похожим на ваш пример. Я могу скомпилировать его и вызвать функции C из VHDL. Но (всегда есть но), возвращаемое значение всегда равно 0, а такие функции, как mti_printmessage или mti_printformated, ничего не записывают в transcript. Есть ли у вас какие-либо идеи о том, как это решить, или ссылка на полезный веб-сайт? Большое спасибо

4. Хорошо, я воссоздал весь проект C, и теперь все работает нормально. Я должен был изменить что-то не так в параметрах проекта. Спасибо, Чиггс, за вашу помощь