-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwriteback.sv
99 lines (86 loc) · 3.68 KB
/
writeback.sv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
class goldenref_writeback;
virtual dut_Probe_WB.WB dutprobewb;
logic[15:0] regfile[8];
function new(virtual dut_Probe_WB.WB dutprobewb);
this.dutprobewb=dutprobewb;
endfunction
task run();
fork
//thread for asynchronous VSR1 signal
forever
begin
@regfile[dutprobewb.writeback_sr1];
begin
dutprobewb.goldenref_writeback_VSR1 = regfile[dutprobewb.writeback_sr1];
end
end
//thread for asynchronous VSR2 signal
forever
begin
@regfile[dutprobewb.writeback_sr2];
begin
dutprobewb.goldenref_writeback_VSR2 = regfile[dutprobewb.writeback_sr2];
end
end
//thread for sync signals
forever
begin
@(dutprobewb.cb_writeback);
if(dutprobewb.writeback_reset) // Reset = 1
begin
dutprobewb.goldenref_writeback_psr <= 3'b000; // reset value
end
else // Reset = 0
begin
if(dutprobewb.cb_writeback.writeback_enable_writeback) // enable = 1
begin
case(dutprobewb.cb_writeback.writeback_W_control_in)
0:regfile[dutprobewb.cb_writeback.writeback_dr] <= dutprobewb.cb_writeback.writeback_aluout;
1:regfile[dutprobewb.cb_writeback.writeback_dr] <= dutprobewb.cb_writeback.writeback_memout;
2:regfile[dutprobewb.cb_writeback.writeback_dr] <= dutprobewb.cb_writeback.writeback_pcout;
endcase
case(dutprobewb.cb_writeback.writeback_W_control_in) //enable = 1
0: begin
if(dutprobewb.cb_writeback.writeback_aluout[15]==1)
begin dutprobewb.goldenref_writeback_psr <= 3'b100; end
else if((dutprobewb.cb_writeback.writeback_aluout[15]==0) && (dutprobewb.cb_writeback.writeback_aluout!=0) )
begin dutprobewb.goldenref_writeback_psr <= 3'b001; end
else if(dutprobewb.cb_writeback.writeback_aluout==0)
begin dutprobewb.goldenref_writeback_psr <= 3'b010; end
end//case 0 end
1: begin
if(dutprobewb.cb_writeback.writeback_memout[15]==1)
begin dutprobewb.goldenref_writeback_psr <= 3'b100; end
else if((dutprobewb.cb_writeback.writeback_memout[15]==0) && (dutprobewb.cb_writeback.writeback_memout!=0) )
begin dutprobewb.goldenref_writeback_psr <= 3'b001; end
else if(dutprobewb.cb_writeback.writeback_memout==0)
begin dutprobewb.goldenref_writeback_psr <= 3'b010; end
end//case 1 end
2: begin
if(dutprobewb.cb_writeback.writeback_pcout[15]==1)
begin dutprobewb.goldenref_writeback_psr <= 3'b100; end
else if((dutprobewb.cb_writeback.writeback_pcout[15]==0) && (dutprobewb.cb_writeback.writeback_pcout!=0) )
begin dutprobewb.goldenref_writeback_psr <= 3'b001; end
else if(dutprobewb.cb_writeback.writeback_pcout==0)
begin dutprobewb.goldenref_writeback_psr <= 3'b010; end
end//case 2 end
endcase
end // end for enable writeback
end // else end
end // thread end
join
endtask : run
//checker for writeback stage
task writeback_checker();
forever
begin
@(negedge dutprobewb.writeback_clk);
if(dutprobewb.goldenref_writeback_psr !== dutprobewb.writeback_psr)
$display($time,"In Write back stage, Golden Reference value of PSR %h does not match Value from DUT of PSR %h ", dutprobewb.goldenref_writeback_psr,dutprobewb.writeback_psr);
if(dutprobewb.goldenref_writeback_VSR1 !== dutprobewb.writeback_VSR1)
$display($time,"In Write back stage, Golden Reference value of VSR1 %h does not match Value from DUT of VSR1 %h ",dutprobewb.goldenref_writeback_VSR1,dutprobewb.writeback_VSR1);
if(dutprobewb.goldenref_writeback_VSR2 !== dutprobewb.writeback_VSR2)
$display($time,"In Write back stage, Golden Reference value of VSR2 %h does not match Value from DUT of VSR2 %h ",dutprobewb.goldenref_writeback_VSR2,dutprobewb.writeback_VSR2);
end
endtask: writeback_checker
endclass : goldenref_writeback