求解决!!!SystemVerilog在ModelSim中的编译与运行

本文探讨了在使用SystemVerilog时遇到的关于`function`在`ModelSim`中编译和运行的问题。通过示例Code1和Code2说明了在定义`function`时添加`automatic`关键字的重要性。同时,文章提出疑问,如何将`function`包含在`program`结构中,类似Code3所示,并展示了尝试的Code4及其导致的编译警告和运行错误。错误信息表明在非`program`设计单元中非法访问`program`项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

是在学习SV过程中,运行书上的例子,碰到的问题。
功能:函数返回数组。

Code1:
/*书上提供的例子,存在错误,不可运行
function void init(ref int f[5], int start);//主要是函数定义时没有声明automatic属性
  foreach(f )
    f = i + start;
endfunction

initial begin
  int fa[5];
  fa = init(fa,5);
  foreach(fa)
    $display("fa[%0d] = %0d", i, fa);
end
*/


#-----------------------------------------------------------------------------------
Code2:
//以下这段代码在modelsim下可成功运行。(在定义function时加上了automatic)
module enum_name;
  int fa[5];
  initial begin
//  fa = init(fa, 5);
  init(fa, 5);
    foreach(fa)
      $display("fa[%0d] = %0d", i, fa);  
end

  function automatic void init(ref int f[5], input int start);
    foreach(f)//初始化数组
      f = i + start;
  endfunction
endmodule
#-----------------------------------------------------------------------------------

Question:
在LRM中第16章,讲解program结果时有如下结构:
Code3:
module test(...)
int shared; // variable shared by programs p1 and p1
program p1;
...
endprogram
program p2;
...
endprogram // p1 and p2 are implicitly instantiated once in module test
endmodule


想问一下,Code2中的function怎么可以包在program...endprogram里面,形成Code3形式的代码结构。
其中,Code4是我尝试改的,但在ModelSim中编译可以通过,但运行时报错。

Code4:
module enum_name;
  int fa[5];
  initial begin

//  fa = init(fa, 5);
    test.init(fa, 5); //对应报错信息中提示的第61行内容
    foreach(fa)
       $display("fa[%0d] = %0d", i, fa);  
  end
//------------------------------------------------------------;
  program automatic test;
    function automatic void init(ref int f[5], input int start);
      foreach(f)//初始化数组
        f = i + start;
   endfunction
  endprogram
endmodule


运行时报错内容:
# Compile of enum_name.sv was successful with warnings.
vsim -gui work.enum_name
# vsim -gui work.enum_name 
# Loading sv_std.std
# Loading work.enum_name
# ** Error: (vsim-3927) D:/ModelSim/SysVerilog/enum/enum_name.sv(61) Accessing program item '/enum_name/test/init' from a non-program design unit enum_name is illegal.

#         Region: /enum_name
# ** Error: (vsim-3927) D:/ModelSim/SysVerilog/enum/enum_name.sv(61) Accessing program item '/enum_name/test/init' from a non-program design unit enum_name is illegal.

#         Region: /enum_name
# ** Error: (vsim-3927) D:/ModelSim/SysVerilog/enum/enum_name.sv(61) Accessing program item '/enum_name/test/init' from a non-program design unit enum_name is illegal.

#         Region: /enum_name
Error loading design



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值