Skip to content

Commit 01eaeee

Browse files
committed
Move to Vips1 for 1st version
1 parent 1d33f07 commit 01eaeee

File tree

1 file changed

+248
-0
lines changed

1 file changed

+248
-0
lines changed

src/vips1.veryl

Lines changed: 248 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,248 @@
1+
// src/vips1.veryl
2+
3+
module Vips1 (
4+
i_clk : input clock ,
5+
i_reset : input reset_async_high ,
6+
i_dbg_reg : input logic <5> ,
7+
o_dbg_reg_data: output logic <32>,
8+
) {
9+
var pc_addr: logic<32>;
10+
11+
inst pcplus4: PcPlus4 (
12+
i_clk ,
13+
i_reset ,
14+
o_pc : pc_addr,
15+
);
16+
17+
var instr: logic<32>;
18+
19+
inst instr_mem: InstrMem (
20+
i_addr : pc_addr,
21+
o_instr: instr ,
22+
);
23+
24+
let opcode: logic<6> = instr[31:26];
25+
let funct : logic<6> = instr[5:0];
26+
let rs : logic<5> = instr[25:21];
27+
let rt : logic<5> = instr[20:16];
28+
let rd : logic<5> = instr[15:11];
29+
let imm : logic<16> = instr[15:0];
30+
31+
var reg_destination: logic ;
32+
var z : logic ;
33+
var write_enable : logic ;
34+
var sign_extend : logic ;
35+
var alu_source : logic ;
36+
var alu_sub : logic ;
37+
var alu_op : logic<2>;
38+
39+
inst decoder: Decoder (
40+
opcode ,
41+
funct ,
42+
z ,
43+
reg_destination ,
44+
write_enable ,
45+
sign_extend ,
46+
alu_source ,
47+
alu_sub ,
48+
alu_op ,
49+
);
50+
51+
var wb_reg: logic<5>;
52+
53+
inst reg_d_mux: Mux2 #(
54+
Width: 5,
55+
) (
56+
i_data: {rt, rd} ,
57+
i_sel : reg_destination,
58+
o_data: wb_reg ,
59+
);
60+
61+
var a_data: logic<32>;
62+
var b_data: logic<32>;
63+
var w_data: logic<32>;
64+
65+
inst regfile: RegFile (
66+
i_clk ,
67+
i_reset ,
68+
i_a_addr : rs ,
69+
i_b_addr : rt ,
70+
i_w_ena : write_enable ,
71+
i_w_addr : wb_reg ,
72+
i_w_data : w_data ,
73+
i_dbg_addr: i_dbg_reg ,
74+
o_a_data : a_data ,
75+
o_b_data : b_data ,
76+
o_dbg_data: o_dbg_reg_data,
77+
);
78+
79+
var imm32ext: logic<32>;
80+
81+
inst extend16to32: Extend16to32 (
82+
i_data : imm ,
83+
i_sign_ext: sign_extend,
84+
o_data : imm32ext ,
85+
);
86+
87+
var alu_src: logic<32>;
88+
89+
inst alu_src_mux: Mux2 (
90+
i_data: {b_data, imm32ext},
91+
i_sel : alu_source ,
92+
o_data: alu_src ,
93+
);
94+
95+
var v: logic;
96+
var c: logic;
97+
98+
inst alu: Alu (
99+
a : a_data ,
100+
b : alu_src,
101+
sub: alu_sub,
102+
op : alu_op ,
103+
r : w_data ,
104+
v ,
105+
c ,
106+
z ,
107+
);
108+
}
109+
110+
#[test(vips1)]
111+
embed (inline) sv{{{
112+
module test;
113+
114+
logic i_clk;
115+
logic i_reset;
116+
logic [4:0] i_dbg_reg;
117+
logic [31:0] o_dbg_reg_data;
118+
119+
vips_Vips1 vips(i_clk, i_reset, i_dbg_reg, o_dbg_reg_data);
120+
121+
task clock;
122+
begin
123+
i_clk = 0; #10; i_clk = 1; #10;
124+
end
125+
endtask
126+
127+
initial begin
128+
i_reset = 1;
129+
clock(); // 00 addi zero at 4, (nop)
130+
assert (vips.pc_addr == 32'h00);
131+
assert (vips.write_enable == 1);
132+
assert (vips.alu_source == 1);
133+
assert (vips.alu_op == 2'b10);
134+
assert (vips.alu_sub == 0);
135+
assert (vips.sign_extend == 1);
136+
assert (vips.reg_destination == 0);
137+
138+
i_reset = 0;
139+
clock(); // 04 addi zero at -8, (nop)
140+
assert (vips.pc_addr == 32'h04);
141+
assert (vips.write_enable == 1);
142+
assert (vips.alu_source == 1);
143+
assert (vips.alu_op == 2'b10);
144+
assert (vips.alu_sub == 0);
145+
assert (vips.sign_extend == 1);
146+
assert (vips.reg_destination == 0);
147+
148+
clock(); // 08 addi r1 r2 8, (r1 <- 8)
149+
assert (vips.pc_addr == 32'h08);
150+
assert (vips.write_enable == 1);
151+
assert (vips.alu_source == 1);
152+
assert (vips.alu_op == 2'b10);
153+
assert (vips.alu_sub == 0);
154+
assert (vips.sign_extend == 1);
155+
assert (vips.reg_destination == 0);
156+
157+
clock(); // 0c add r2 zero r1 (r2 <- 8)
158+
assert (vips.pc_addr == 32'h0c);
159+
assert (vips.write_enable == 1);
160+
assert (vips.alu_source == 0);
161+
assert (vips.alu_op == 2'b10);
162+
assert (vips.alu_sub == 0);
163+
assert (vips.sign_extend == 0); // don't care
164+
assert (vips.reg_destination == 1);
165+
166+
clock(); // 10 addi r2 zero 2 (r2 <- 2)
167+
assert (vips.pc_addr == 32'h10);
168+
assert (vips.write_enable == 1);
169+
assert (vips.alu_source == 1);
170+
assert (vips.alu_op == 2'b10);
171+
assert (vips.alu_sub == 0);
172+
assert (vips.sign_extend == 1);
173+
assert (vips.reg_destination == 0);
174+
175+
clock(); // 14 sub r3 r2 r1 (r3 <- 2 - 8 = -6)
176+
assert (vips.pc_addr == 32'h14);
177+
assert (vips.write_enable == 1);
178+
assert (vips.alu_source == 0);
179+
assert (vips.alu_op == 2'b10);
180+
assert (vips.alu_sub == 1);
181+
assert (vips.sign_extend == 0); // don't care
182+
assert (vips.reg_destination == 1);
183+
184+
clock(); // 18 slt r4 zero v1 (r4 <- zero < (-6) = 0)
185+
assert (vips.pc_addr == 32'h18);
186+
assert (vips.write_enable == 1);
187+
assert (vips.alu_source == 0);
188+
assert (vips.alu_op == 2'b11);
189+
assert (vips.alu_sub == 1);
190+
assert (vips.sign_extend == 0); // don't care
191+
assert (vips.reg_destination == 1);
192+
193+
clock(); // 1c slti r4 v1 -5 (r4 <- (-6) < (-5) = 1)
194+
assert (vips.pc_addr == 32'h1c);
195+
assert (vips.write_enable == 1);
196+
assert (vips.alu_source == 1);
197+
assert (vips.alu_op == 2'b11);
198+
assert (vips.alu_sub == 1);
199+
assert (vips.sign_extend == 1);
200+
assert (vips.reg_destination == 0);
201+
202+
clock(); // 20 slt r5 zero r1 (r5 <- 0 < 8 = 1)
203+
assert (vips.pc_addr == 32'h20);
204+
assert (vips.write_enable == 1);
205+
assert (vips.alu_source == 0);
206+
assert (vips.alu_op == 2'b11);
207+
assert (vips.alu_sub == 1);
208+
assert (vips.sign_extend == 0); // don't care
209+
assert (vips.reg_destination == 1);
210+
211+
clock(); // 24 or r6 r3 zero (r6 <- -6 | 0 = -6)
212+
assert (vips.pc_addr == 32'h24);
213+
assert (vips.write_enable == 1);
214+
assert (vips.alu_source == 0);
215+
assert (vips.alu_op == 2'b01);
216+
assert (vips.alu_sub == 0);
217+
assert (vips.sign_extend == 0);
218+
assert (vips.reg_destination == 1);
219+
220+
clock(); // 28 and r7 r1 r3 (r7 <- b0..1000 & b1..1010 = b1000 )
221+
assert (vips.pc_addr == 32'h28);
222+
assert (vips.write_enable == 1);
223+
assert (vips.alu_source == 0);
224+
assert (vips.alu_op == 2'b00);
225+
assert (vips.alu_sub == 0); // don't care
226+
assert (vips.sign_extend == 0);
227+
assert (vips.reg_destination == 1);
228+
229+
clock(); // 2c nor a4 at v1 (-- not supported --)
230+
assert (vips.pc_addr == 32'h2c);
231+
assert (vips.write_enable == 0);
232+
assert (vips.alu_source == 0); // don't care
233+
assert (vips.alu_sub == 0); // don't care
234+
assert (vips.sign_extend == 0); // don't care
235+
assert (vips.reg_destination == 1); // don't care
236+
237+
clock(); // 30 lui zero 1 (-- not supported --)
238+
assert (vips.pc_addr == 32'h30);
239+
assert (vips.write_enable == 0);
240+
assert (vips.alu_source == 0); // don't care
241+
assert (vips.alu_sub == 0); // don't care
242+
assert (vips.sign_extend == 0); // don't care
243+
assert (vips.reg_destination == 0); // don't care
244+
245+
$finish;
246+
end
247+
endmodule
248+
}}}

0 commit comments

Comments
 (0)