Modelsim /读取信号值

时间:2014-06-30 13:32:11

标签: vhdl modelsim

在我的模拟中,我希望RW能够访问项目中的信号。为了获得写访问权限,我使用modelsim_lib库中的“signal_force”过程。但是为了获得读访问权限,我找不到相应的功能。

signal_force符合我的需求的原因是我正在使用输入文本文件,所以我有一个“字符串”或“行”变量的信号的名称和值,我可以直接给出这些变量对于功能。 我不能使用“init_signal_spy”过程,因为此过程不会将值返回到字符串中,而只是将信号的行为复制到另一个上。由于我的项目必须尽可能通用,我使用声明为过程的变量,我无法将信号链接到变量。

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

<强>编辑

对不起,我赢了#34;没有仔细阅读&#34;当天获奖...

为了完整起见,我留下了我的答案中涉及信号间谍(这是一种专有的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(如果你支持它),访问不在范围内的信号的标准方法是分层/外部名称,作为奖励,它同时执行&#34;写&#34;并且&#34;阅读&#34;。我可能在细微差别上有点生疏,但你可以访问它们:

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

我相信,你应该可以使用它代替任何正常的范围内标识符。别名,作业等

答案 1 :(得分:0)

如果您对编写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手册中有大量示例代码。