Vhdl Modelsim/读取信号值

Vhdl Modelsim/读取信号值,vhdl,modelsim,Vhdl,Modelsim,在我的模拟中,我希望RW能够访问项目中任何地方的信号。为了获得写访问权,我使用modelsim_lib库中的“signal_force”过程。但是要获得读取权限,我还没有找到相应的函数 之所以signal_force适合我的需要,是因为我正在处理输入文本文件,所以我从“string”或“line”变量中获得了信号的名称和值,我可以直接将这些变量提供给函数。 我不能使用“init_signal_spy”过程,因为这个过程不会将值返回到字符串中,而是将信号的行为复制到另一个字符串中。由于我的项目必须

在我的模拟中,我希望RW能够访问项目中任何地方的信号。为了获得写访问权,我使用modelsim_lib库中的“signal_force”过程。但是要获得读取权限,我还没有找到相应的函数

之所以signal_force适合我的需要,是因为我正在处理输入文本文件,所以我从“string”或“line”变量中获得了信号的名称和值,我可以直接将这些变量提供给函数。 我不能使用“init_signal_spy”过程,因为这个过程不会将值返回到字符串中,而是将信号的行为复制到另一个字符串中。由于我的项目必须尽可能通用,我使用声明到过程中的变量,并且我不能将信号链接到变量上


感谢您的帮助

编辑

对不起,我赢得了当天的“未仔细阅读”奖

为了完整起见,我在回答中留下了关于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>>


我相信,您应该能够使用它来代替任何普通的范围内标识符。别名、赋值等。

如果您对编写C代码感到满意,那么使用VHPI应该可以直接实现您想要的功能,尽管遗憾的是,尽管Mentor是VHDL标准的一部分,但他们并不打算实现它。不过,也可以使用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);

    ...
}
#包括
#包括“mti.h”
/*将VHDL字符串数组转换为以NULL结尾的字符串*/
静态字符*获取字符串(mtiVariableIdT id)
{
静态字符buf[1000];
mtiTypeIdT型;
内伦;
mti_GetArrayVarValue(id,buf);
type=mti_GetVarType(id);
len=mti_长度(类型);
buf[len]=0;
返回buf;
}
取消我的职能(
字符串形式的mtiVariableIdT vhdl_path/**/
mtiVariableIdT vhdl_值/*输出字符串*/
)
{
mtiSignalIdT sigID=mti_FindSignal(获取字符串(vhdl_路径));
mtiInt32T值=mti_GetSignalValue(sigID);
...
}

FLI手册中有大量示例代码。

您好,谢谢您的回答。我不确定这个解决方案能否解决我的问题,因为它使用了“信号”类型。我的感觉是我试图用VHDL做的是不可能的。好吧,我想我误解了。您正在读取一个指定信号名称的文本文件,并且您正试图通过某种过程动态访问该信号名称?确切地说。例如,我可以访问一个信号来写入一个新值,如下所示:signal\u force(“/tb/dut/path/to/signal”&signal\u name,…,signal\u value);由于signal_名称和signal_值定义为string.Hi Chiggs,我不知道FLI,它看起来很强大。你知道在FLI中是否可以管理信号事件吗?@grorel我认为是的,尽管不像在VHPI中那样简单,在VHPI中,你可以注册一个回调来更改信号的值。有了FLI,我相信你可以创建一个过程并使其对信号敏感。我用一些类似于你例子的代码尝试了FLI。我可以编译它并从VHDL调用C函数。但是(总是有一个But),返回值总是0,像mti_printmessage或mti_printformated这样的函数不会在转录本中写入任何内容。你对如何解决这个问题有什么想法,或者有一个链接到一个有用的网站吗?谢谢你,我已经重新创建了整个C项目,现在一切正常。我应该改变项目参数中的一些错误。谢谢奇格斯的帮助