首页 文章

Modelsim /读取信号值

提问于
浏览
0

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

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

谢谢你的帮助

2 回答

  • 1

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

  • 0

    edited

    对不起,我赢得了当天“没有仔细阅读”的奖项......

    为了完整起见,我将离开我的答案部分,处理信号 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>>
    

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

相关问题