本帖最后由 似水如烟 于 2015-10-29 11:03 编辑
回复 5# gaurson 我会试一下你说的这种方法。采用virtual的方式(同样需要加入延时,使类的打印任务晚于设计模块的执行,即:验证模块->设计模块->延时->验证模块),已经仿真运行,结果也可以正常打印。
采用virtual后的程序改为如下:
//定义接口
interface itf;
logic [1:0]a;
logic [1:0]b;
logic [2:0]o;
modport DUT(
input a,b,
output o
);
modport PM(
input o,
output a,b
);
endinterface:itf;
//module adder(a,b,o);
module adder(itf itf0);
// input bit [1:0] a;
// input bit [1:0] b;
// output bit [2:0]o;
always@(*)
begin
// o = a + b;
itf0.o = itf0.a + itf0.b;
end
endmodule
//program p(input bit [2:0] i, output [1:0]x, output [1:0]y);
program p(itf itf0);
class c;
rand bit [1:0] m;
rand bit [1:0] n;
virtual itf vif;
function new(virtual itf itf0);
vif = itf0;
endfunction:new
function value();
vif.a = m;
vif.b = n;
endfunction:value
task display();
$display("the value of a is %2b!", m);
$display("the value of b is %2b!", n);
// $display("the value of result is %3b!", i);
$display("the value of result is %3b!", vif.o);
endtask:display
endclass:c
c c0;
initial
begin
// c0 = new;
c0 = new(itf0);
c0.randomize();
c0.value();
#1;//设计模块为纯组合逻辑的原因,时序逻辑应该是不需要延时的
c0.display();
end
endprogram:p
module tb;
// wire [1:0]a;
// wire [1:0]b;
// wire [2:0]o;
itf itf0();
// addr a0(
// .a(a),
// .b(b),
// .o(o)
// );
adder a0(itf0);
// p p0(
// .x(a),
// .y(b),
// .i(o)
// );
p p0(itf0);
endmodule
编译执行结果:
the value of a is10!
the value of b is 01!
the value of result is 101! |