-
Notifications
You must be signed in to change notification settings - Fork 0
/
beta_PC
36 lines (27 loc) · 1.07 KB
/
beta_PC
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
.subckt PCREG d[31:0] clk q[31:0]
Xreg dreg d[31:0] clk#32 q[31:0]
.ends
//TODO: get the JT input
.subckt pc clk reset next_ia[30:0] broffset[31:0] pcplus4[31:0] pcsel[2:0] JT[31:0]
Xillop join illop[31:0] vdd gnd#28 vdd gnd#2 //illop at address 4
Xxadr join xadr[31:0] vdd gnd#27 vdd gnd#3 //xadr at address 8
Xreset join reset[31:0] vdd gnd#31 //reset at address 0
Xjt31 and2 JT[31] q[31] JT31 //jump can only clear or maintain supervisor bit
Xmux4 32MUX4 pcsel[0:1] pcplus4[31:0] broffset[31:0] JT31 JT[30:0] illop[31:0] mux4out[31:0]
Xmux2 MUX32 pcsel[2] mux4out[31:0] xadr[31:0] mux2out[31:0]
Xresetmux MUX32 reset mux2out[31:0] reset[31:0] d[31:0]
Xreg PCREG d[31:0] clk q[31:0]
Xadd ADD32 gnd#29 vdd gnd#2 q[31:0] gnd pcplus4[31:0] cout
Xjoin join d[30:0] next_ia[30:0]
.ends
.subckt Xpcinc q[31:0] pcplus4[31:0] cout
//First 2 bits
Xjoin join pcplus4[1:0] q[1:0]
//2^2 bit
Xxor4 xor2 q[2] vdd pcplus4[2]
.connect q[2] carryout[2]
//high-order bits
Xcarry and2 carryout[30:2] q[31:3] carryout[31:3]
Xsum xor2 q[31:3] carryout[30:2] pcplus4[31:3]
.connect carryout[31] cout
.ends