在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2645|回复: 8

[求助] $cast语法错误,实在不太懂

[复制链接]
发表于 2019-7-2 19:50:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
莫名其妙的错误,自己也不太懂,不知道是不是$cast的用法用错了 ,报的$cast函数那一行的错误。实在看不懂了
-- Compiling interface AXI_vif
# ** Error: (vlog-13069) ** while parsing file included at demo_top.sv(28)
# ** at axi_master_read_seq_lib.sv(26): near ")": syntax error, unexpected ')', expecting '.'.
#
#
# End time: 19:45:01 on Jul 02,2019, Elapsed time: 0:00:02

代码如下:
class AXI_master_write_seq extends AXI_transfer;

  AXI_transfer m_trx;

  function new(string name            = "axi_master_write_seq",
               int unsigned addr      = 32'h0000_1000,
               byte_enum ibyte        = BYTE_4,
               len_enum len           = LEN_4,
               burst_enum burst       = INCR,
               int unsigned id        = 1,
               int unsigned data[$]   = { 32'h0000_0001,
                                          32'h0000_0002,
                                          32'h0000_0003,
                                          32'h0000_0004 },
               int unsigned strb[$]   = { 4'b1111,
                                          4'b1111,
                                          4'b1111,
                                          4'b1111 },
               int unsigned addr_delay  = 0,
               int unsigned data_delay  = 0,
               int unsigned resp_delay  = 0
                );

    super.new(name);
       
  $cast(m_trx,super);

    m_trx.rw            = WRITE;
    m_trx.addr          = addr;
    m_trx.size          = ibyte;
    m_trx.len           = len;
    m_trx.burst         = burst;
    m_trx.id            = id;
    m_trx.data_bytes    = 4;
    m_trx.data          = data;
    m_trx.strb          = strb;
    m_trx.addr_wt_delay = addr_delay;
    m_trx.data_wt_delay = data_delay;
    m_trx.resp_wt_delay = resp_delay;

  endfunction

  `uvm_object_utils(AXI_master_write_seq)

endclass : AXI_master_write_seq

发表于 2019-7-3 10:22:46 | 显示全部楼层
首先我奇怪 $cast(m_trx,super); 这条语句写法很怪异,如果你只是想在new的时候将这些参数传给父类,你完全可以使用super.rw = WRITE; 这样的语法。
其次还有一个严重的问题,就是如果要使用uvm factory,那你AXI_master_write_seq类的new函数就不能添加除string name之外的任何其他参数,不然你下次在使用xxx = AXI_master_write_seq:type_id::create("xxx")时候会报错。
 楼主| 发表于 2019-7-4 10:13:09 | 显示全部楼层


ppeezz 发表于 2019-7-3 10:22
首先我奇怪 $cast(m_trx,super); 这条语句写法很怪异,如果你只是想在new的时候将这些参数传给父类,你完全 ...


按你第一条说的,我改成了 super.rw  = WRITE.......  编译通过,运行报错:
# ** Fatal: (SIGSEGV) Bad handle or reference.
#    Time: 0 ps  Iteration: 121  Process: /uvm_pkg::uvm_task_phase::execute/#FORK#137(#ublk#215181159#137)_4f62579d File: E:/questasim/win64/../verilog_src/uvm-1.1d/src/base/uvm_object.svh
# Fatal error in Function uvm_pkg/uvm_object::sprint at E:/questasim/win64/../verilog_src/uvm-1.1d/src/base/uvm_object.svh line 901
#
# HDL call sequence:
# Stopped at E:/questasim/win64/../verilog_src/uvm-1.1d/src/base/uvm_object.svh 901 Function uvm_pkg/uvm_object::sprint
# called from  E:/questasim/win64/../verilog_src/uvm-1.1d/src/base/uvm_object.svh 880 Function uvm_pkg/uvm_object::print
# called from  demo_scoreboard.sv 49 Task demo_top_sv_unit/Demo_scoreboard::main_phase
# called from  E:/questasim/win64/../verilog_src/uvm-1.1d/src/base/uvm_runtime_phases.svh 343 Task uvm_pkg/uvm_main_phase::exec_task
# called from  E:/questasim/win64/../verilog_src/uvm-1.1d/src/base/uvm_task_phase.svh 150 Function uvm_pkg/uvm_task_phase::execute


发表于 2019-7-4 11:00:20 | 显示全部楼层
我前面提到的第二个问题是否有注意,即,“AXI_master_write_seq类的new函数就不能添加除string name之外的任何其他参数”, 如果想要实现你的功能,可以保持AXI_master_write_seq类的new函数为只有string name的输入,然后在AXI_master_write_seq类里面新建一个函数 cfg(.............),然后把你要的输入放在这里,这样你对AXI_master_write_seq类new之后,再调用一下AXI_master_write_seq.cfg(......),应该就可以了
 楼主| 发表于 2019-7-4 12:02:33 | 显示全部楼层
本帖最后由 宋凡 于 2019-7-4 15:15 编辑



 楼主| 发表于 2019-7-4 15:14:36 | 显示全部楼层


ppeezz 发表于 2019-7-4 11:00
我前面提到的第二个问题是否有注意,即,“AXI_master_write_seq类的new函数就不能添加除string name之外的 ...


`include "axi_transfer.sv"
class AXI_master_write_seq extends AXI_transfer;

  function new(string name  = "axi_master_write_seq");
   super.new(name);
   endfunction

  function void trans(
               int unsigned addr      = 32'h0000_1000,
               byte_enum ibyte        = BYTE_4,
               len_enum len           = LEN_4,
               burst_enum burst       = INCR,
               int unsigned id        = 1,
               int unsigned data[$]   = { 32'h0000_0001,
                                          32'h0000_0002,
                                          32'h0000_0003,
                                          32'h0000_0004 },
               int unsigned strb[$]   = { 4'b1111,
                                          4'b1111,
                                          4'b1111,
                                          4'b1111 },
               int unsigned addr_delay  = 0,
               int unsigned data_delay  = 0,
               int unsigned resp_delay  = 0
                );
         
    super.rw            = WRITE;
    super.addr          = addr;
    super.size          = ibyte;
    super.len           = len;
    super.burst         = burst;
    super.id            = id;
    super.data_bytes    = 4;
    super.data          = data;
    super.strb          = strb;
    super.addr_wt_delay = addr_delay;
    super.data_wt_delay = data_delay;
    super.resp_wt_delay = resp_delay;
endfunction


  `uvm_object_utils(AXI_master_write_seq)

endclass : AXI_master_write_seq


改了之后,还是报错

# ** Fatal: (SIGSEGV) Bad handle or reference.
#    Time: 0 ps  Iteration: 121  Process: /uvm_pkg::uvm_task_phase::execute/#FORK#137(#ublk#215181159#137)_4f6277bd File: E:/questasim/win64/../verilog_src/uvm-1.1d/src/base/uvm_object.svh
# Fatal error in Function uvm_pkg/uvm_object::sprint at E:/questasim/win64/../verilog_src/uvm-1.1d/src/base/uvm_object.svh line 901
#
# HDL call sequence:
# Stopped at E:/questasim/win64/../verilog_src/uvm-1.1d/src/base/uvm_object.svh 901 Function uvm_pkg/uvm_object::sprint
# called from  E:/questasim/win64/../verilog_src/uvm-1.1d/src/base/uvm_object.svh 880 Function uvm_pkg/uvm_object::print
# called from  demo_scoreboard.sv 49 Task demo_top_sv_unit/Demo_scoreboard::main_phase
# called from  E:/questasim/win64/../verilog_src/uvm-1.1d/src/base/uvm_runtime_phases.svh 343 Task uvm_pkg/uvm_main_phase::exec_task
# called from  E:/questasim/win64/../verilog_src/uvm-1.1d/src/base/uvm_task_phase.svh 150 Function uvm_pkg/uvm_task_phase::execute
#

发表于 2019-7-4 15:43:26 | 显示全部楼层
没看明白你想实现什么功能,为什么要用super?你是继承的类,直接就能用啊,把所有super.都去掉
发表于 2019-7-4 20:16:39 | 显示全部楼层
你的代码中是否哪里调用了xxx.sprint(),才出发了error?
发表于 2019-7-6 16:31:36 | 显示全部楼层
楼主可以试试加上define UVM_OBJECT_MUST_HAVE_CONSTRUCTOR,或者直接去掉new function
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

×

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-14 17:55 , Processed in 0.021806 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表