求助:UVM中peek与read的区别这样大么?
时间:10-02
整理:3721RD
点击:
各位:
我还在折腾UVM。终于能用virtual sequence来启动register sequence了,但是又出来了一个新问题。我是这样操作的,先用poke将memory中填上数,然后用read读出来,结果,仿真在进行到read的时候就直接退出了,但是什么都不变,把read变成peek就能正确读出数据。这到底是为什么呀,我想dump个波形也dump不出来,感觉没地下手啊。
我的register sequence:
我还在折腾UVM。终于能用virtual sequence来启动register sequence了,但是又出来了一个新问题。我是这样操作的,先用poke将memory中填上数,然后用read读出来,结果,仿真在进行到read的时候就直接退出了,但是什么都不变,把read变成peek就能正确读出数据。这到底是为什么呀,我想dump个波形也dump不出来,感觉没地下手啊。
我的register sequence:
- class base_reg_seq extends uvm_reg_sequence;
- my_reg_block regmodel;
- `uvm_object_utils(base_reg_seq)
- function new(string name="base_reg_seq");
- super.new(name);
- endfunction : new
- rand uvm_reg_addr_t addr;
- rand uvm_reg_data_t data;
- virtual task body();
- starting_phase.raise_objection(this);
- uvm_status_e status;
- addr=32'h0;
- data=32'h1;
- repeat(1024) begin
- regmodel.n_ram.poke(status,addr,data);
- addr++;
- data += 32'h10;
- end
- addr=32'h0;
- repeat(1024) begin
- $display("=====Read data=====");
- regmodel.n_ram.read(status,addr,data);
- $display("Read Method : %0h@%0h",data,addr);
- addr++;
- end
- starting_phase.drop_objection(this);
- endtask : body()
- endclass : base_reg_seq
- class vsequence extends uvm_sequence;
- `uvm_object_utils(vsequence)
- `uvm_declare_p_sequencer(vsequencer)
- base_reg_seq reg_seq
- function new(string name="vsequence");
- super.new(name);
- endfunction : new
- virtual task body();
- reg_seq=base_reg_seq::type_id::create("reg_seq");
- reg_seq.regmodel=p_sequencer.regmodel;
- reg_seq.start(null);
- endtask : body
- endclass : vsequence
同求解释
poke和peek都是backdoor操作,所以波形上是看不出来的。至于read操作错误,期待高手。
试下UVM_FULL看下打印信息吧。看是不是你sequence 启动的phase和driver是不是在同一个phase。或者是driver错了,或者是reg_model set_sequencer不对,这个情况很多。你懂得。你给的代码太少了。
有没有可能你适配到总线出错,导致使用front_door的操作就会结束