#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
report “ERROR: 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, и теперь все работает нормально. Я должен был изменить что-то не так в параметрах проекта. Спасибо, Чиггс, за вашу помощь