在我的模拟中,我希望RW能够访问项目中的信号。为了获得写访问权限,我使用modelsim_lib库中的“signal_force”过程。但是为了获得读访问权限,我找不到相应的功能。
signal_force符合我的需求的原因是我正在使用输入文本文件,所以我有一个“字符串”或“行”变量的信号的名称和值,我可以直接给出这些变量对于功能。 我不能使用“init_signal_spy”过程,因为此过程不会将值返回到字符串中,而只是将信号的行为复制到另一个上。由于我的项目必须尽可能通用,我使用声明为过程的变量,我无法将信号链接到变量。
感谢您的帮助
答案 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手册中有大量示例代码。