|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
引言
! i- c, I* y3 w4 \* Y1 v经过对OpenRISC近一年的分析与研究,在此过程中我们了解了计算机体系结构设计相关的主要概念,重要的技术,和基本思想。我觉的,现在我们有必要练练手了。
R( R. W0 g [8 u4 n9 @
; ?& d1 ^8 O0 ~+ B7 Y本小节,我们将设计一个简单的cpu,包括ISA的设计,模块的划分,RTL实现,编写asm汇编程序,用modelsim进行仿真,以及用quartusII的综合。$ j8 j& d: l' L( _4 g
7 {. {. e* D5 C1 S9 r+ _% C' ?" G$ G* e5 X" N
' ?' f5 J6 ^- m8 z! I7 l' w% X0 J* C
1,计算器与计算机' o+ V/ G& m+ }& z% Y0 z! M4 n
我认为,在EDVAC计算机之前的计算机,都可认为是计算器。5 I7 X; ]) e; W; r2 A
9 s* y) s+ d. i9 ]# ]8 p$ B, C原因是,冯诺依曼对EDVAC分析时提出了二进制运算和加入存储部件,而在这之前的计算机是没有存储功能的,比如我们要计算(1+2)&(3+4),如果是采用计算器,其运算步骤如下:' J6 Z# u: t$ Y( h1 m% f
- Y2 t5 v, F: X3 ga,先用计算器算出1+2的结果3,然后人脑自己记住这个数。3 ]$ q8 D4 y" ]$ _
; p) y9 B; ]8 s% k4 F8 m1 L
b,再用计算器计算出3+4的结果7,人脑也自己记住这个数。
4 k. ~8 t" M0 Z* d2 i: Z' Z! e5 }
c,最后用计算器算出3&7的结果3。* y& e6 ^. C- l- z3 W& W
9 ?7 e: [) q% O5 s
& n( V+ m: l9 g9 S! ^
9 @1 ^6 T8 }" W如果采用计算机,其运算过程如下:
/ Q3 c# H( X. F) {5 W4 d- J6 Q) w; T# S* B
首先我们需要写一段程序,假设程序放在程序存储器的地址0x0处,数据1,2,3,4分别放在数据存储器的55,56,57,58四个地址。
& ?4 _% w* R) u
O: q. e8 n4 O1 o程序的执行过程如下:
1 P4 L& Y' K! |3 c! A; T" L, l- o( Q2 h
( w+ B" }% k, A) l2 Va,将data_mem的0x55处的数据放到r1。
+ t& N1 s+ w" X7 {. Q+ C- q8 I6 u1 G0 B/ ~4 f$ V
b,将data_mem的0x56处的数据放到r2。+ T9 S2 t- v1 h) o* J l" q5 x
& i8 \; Z6 A% {1 K8 D
c,执行add r2,r1,结果放在r2里面。2 l% z' l7 c, Y; J# J) ?
# c& N5 t: h `1 I1 Id,将r2的内容写入到data_mem的0x60这个地址。' ]0 O2 n+ Y) l, `1 x. u* ^& g
% K! Q l- f- H' N$ ]/ [) T' s- M8 ^
z. C. V$ G0 T! S9 o# R% y$ S. ]0 H- _( F. r4 A, R
e,将data_mem的0x57处的数据放到r3。
# M2 k& @: \0 W# t n6 }: g9 i, o8 |9 b( [" m$ q
f,将data_mem的0x58处的数据放到r4。
, A3 S. N l5 s( j u/ V, J
5 p* A4 V) g9 J5 J# j5 rg,执行add r4,r3,结果放在r4里面。
# l# T( H+ }5 V2 v
- j8 J% ~0 y" f/ h& Sh,将r4的内容写入到data_mem的0x61这个地址。
5 P8 b% h# x: d% Q. V' v) {% J; q7 u6 A' d, G2 M
* R {% K$ j; T
8 o$ |# x# _3 H. h0 C" E3 q
i,将data_mem的0x60处的数据放到r5。1 V: {' D( ?- Q! V, e; h& a
8 F. C0 a- X0 P( n9 n( M. N% @j,将data_mem的0x61处的数据放到r6。! X0 F2 P$ D' s
1 J4 H3 ^9 k" U8 Ek,执行and r6,r5,结果放在r6里面。* J9 u, ?! N+ S1 u$ ^! M
; D, T' a! z! L( r; ?. ^% v0 c
l,将r6的内容写入到data_mem的0x62这个地址,最终得到计算结果。% m8 s7 F& C$ I6 ~8 j* n/ [
' G- [% w2 m; x: u4 o( ?! d
* ^* Y6 |7 y! k! X+ ^+ |我们可以看出,如果用计算器计算,只需三步就可以完成,但是如果用计算机的话需要12步才能完成。那是不是用计算机的效率低呢?今天计算机的蓬勃发展使答案不言而喻。
( Y( o4 e. \4 r. Z4 C- f* K
2 u3 ^2 K: }4 p8 O8 F原因就是只要实现写好程序,用计算机的整个计算过程不用人为干预。& v/ T; w) H. J8 x7 j
5 g# w) p! B0 a6 A, T
我想这正是计算机发展的根本原因之所在,就是计算机的出现是对人的很大解放。我们只要按照一定的方式写好程序,然后交给计算机,计算机会自动完成任务,而我们的手就可以干些其他的事情了!2 V& G) X4 ^, C- U- x
, n3 E! y+ e3 g U
& h- R8 S8 o; e& v9 P
& s y4 y7 U/ }% u2,架构设计9 \3 c+ @1 f$ Z+ k; V6 ^+ h; m
1>整体设计5 L2 c4 G0 ^: {# D& u, g$ }, O5 I# q
通过上面的例子,我们可以体会到计算机的好处,下面我们就动手设计一个cpu,来完成1+2的计算。
8 q: L% _ O3 X" D; `
+ j; r/ a b* ]$ ` M' k关于计算机体系结构,我们之前说过的内容已经够多了。这里只说明以下几点:
6 ^: K4 n" g# N0 ?" f5 t
- c( ?9 S5 V; M0 _1 `7 {a,我们采用harvard结构,即,指令和数据的总线是独立的。0 D2 ~( q9 A% c' {
( B) {* `& J/ @/ e% E
b,流水线,我们暂时不采用流水设计,但是在最后,我给出了五级流水时的数据通路设计框架。
# s1 Y% D" u( O9 ^ w9 T; \" Y8 Q8 I; _
c,关于指令集,由于是学习目的,我们只实现基本的访存指令,运算指令和分支指令。运算不支持乘除和浮点。关于具体的指令细节,请参考附录。每条指令为16-bit。; t( C/ A% _" M- X- F. I G# A
& f" m) g/ I& `6 b% e4 ~
d,为了对我们设计的cpu进行仿真和验证,我们需要设计一个简单的soc才行,这个soc只包含指令存储器,cpu内核,数据存储器。9 Z: z# r! V, z
- e3 z' d6 A1 x1 b( b
e,core内总线为8-bit。这就有一个问题,core外是8-bit,但是分支指令的目的地址为11-bit,所以如果超过8-bit,就会有问题,暂时还没解决。
7 l) h& ]$ c% ^' B0 M. G% T% t G- H3 R+ i- T: t- k) f) l7 o
下面是soc的整体架构图:我们给他取个名字吧,就叫 tiny_soc,小cpu就简单的称她为tiny_core。3 R* p2 Q" |3 K% Q p) m2 M
/ C& s7 s) Z: \8 C! N1 q# D+ f1 D2 y* i7 {4 b
: }. N- f- g# g6 r" Q+ V1 N
( G0 e7 Y3 W5 e
2>模块划分+ F* _8 P; S3 W3 d. V
cpu core的结构如下:* ^$ S$ B8 B4 s1 v
/ r7 V) W) U( y
整个cpu core由数据通路和控制通路和调试单元组成。% e, C! l4 x, c) G0 W. ?! ~
|3 ]. }3 s6 e' v+ v+ I
其中数据通路包括:; P4 K) R, a% q4 i) W0 U
2 L" G- c+ C+ W+ ^! g& F- m
PC的产生模块:genpc+ I7 w# U6 i. b# L
; m" N+ c# l A& B$ s# x/ }& r运算模块:alu,在alu的前面是对操作数多选一的一个mux。$ m, g5 c' t }
# D( {3 M& r& S. I T+ h: Z; e寄存器堆:regfile模块
5 P. S: h `, P9 O: h/ f5 i; m
; t; `7 x' @# b% `- d; B还有栈:stack。
9 w) d @5 W; a
* M2 e7 w* @* c+ B' W _8 I* k
, d* e. L$ ~# u/ H B# F
* u t& W# l. G数据通路受控制通路模块ctrl_path模块的控制,控制通路负责指令的解码,并产生对应的控制信号。$ U0 O9 u9 z9 h% ^9 N
3 q# b$ a, E1 ~- P3 y7 [( G" l% ^
/ z0 f3 x+ }, @( Y$ h) Z) n; ^+ S6 N I6 i, R% v
调试单元,由于只是学习目的,调试单元最简化,只输出当前的PC值和当前的指令内容两个信息。
K# x6 B$ \$ l* P& `" \/ a# Q! Q8 h7 q& S/ Q9 F
; B" D& A0 P& N9 p- p% s+ O: L+ T* V4 @6 d1 N: H
8 p _" y! [! ?2 ^1 p3 n
' p5 o' k- a6 j/ M
1 |$ V% z* U+ d0 Z
# d2 H- S7 A: g/ q! u ]
7 _5 r( o7 ~1 q9 _5 N3 O3,模块划分与接口定义
8 |$ I( V; q# }* V/ Z* r整体的架构设计完成后,我们就需要进一步的细化了,这时,需要定义具体的模块名称,模块功能,一旦功能确定之后我们就可以确定具体的模块接口信号了。
/ B/ ?7 C2 V7 M1 W' V1 i9 w& X0 ~, @+ r @
如果模块功能过大,我们需要拆分成更小的模块,这就是top-down的设计方法。关于设计方法学(top-down,bottom-up),很多资料里都有介绍,这里就不再赘述了。
6 y# e# e' |% T. S7 D1 Q' A: i6 I
1 O: M3 h9 h K+ S; y5 {一个完整的工程,和做理论研究不同,需要处理很多实现细节,下面,我们介绍一下,其中比较重要的部分:5 y8 _% L9 a( g3 f4 e
1 R; q: P. J: z: c F R+ V. G ^; U
1>genpc模块) s( U: L( h8 e8 ]9 e5 ^1 j
这里面需要考虑三点:上电复位PC默认值为多少?正常指令执行时PC如何变化?遇到分支指令时PC如何变化?
( A! q' I2 x: d. @; s; P+ m* J
关于上电默认值,我们可以通过一个define语句来设定,允许用户后期修改方便。/ ?- k0 M) s( B3 z" o
( d! q' ]. h$ u9 W
关于正常指令的指令,PC是加1还是加2还是加4,这要看指令存储器的访问方式,我们的指令存储器是每个地址放一条指令,每条指令是2个字节(16-bit),所以我们只要PC加1就可以了。6 W, H# b# c. s! T _# K/ k. E
, s7 m$ y( `! q/ T' ~ Y关于遇到分支指令,我们直接将控制通路经过解码的跳转地址赋给PC即可。
6 I" h5 u; p$ E- T. _6 ~
7 o+ q' ~/ g$ t, }genpc模块的C语言伪代码如下:5 t6 V% L/ G& ^) D% Y" D
# p5 Q$ D' ?$ [+ m# J w s
3 V( Z4 e+ D2 [. k" D2 ^6 d( n1 D7 _3 D7 Y z1 g0 O) h) K
genpc module pseudo code+ a4 V" F5 x( N( {( @
2 ]5 u) [" M' e6 P9 T% A+ u4 I+ a
if(rst); S( F% `( o# g
{
# G- p+ O+ }# h- c0 g pc= boot_addr; q: Z! I6 ?* x
}0 C: D% `3 m* l% u
else
j( [# X8 y, y{
, U& J% N2 u3 q7 _4 c& R: O if(branch)
1 L4 S5 J- l/ L0 R% Q4 H* ?9 w: C. ~ {+ i! d4 ]; z8 z4 J3 j6 k4 s
pc = branch_target;
# v1 c7 m* r7 w }
& {- v; }3 B* k) g2 {8 t else
+ z4 S' e" ]( Q8 N$ g+ ~( X: k {! d8 R: D$ L$ o
pc = pc +1;3 O Z. O) L5 b4 i. i
}' k3 w" Q8 A' k6 v6 h9 Q
} j7 ^/ n3 r4 d) a& V& N
" _8 Z- j3 `; Q' P6 Y. `4 B: j
3 u/ ?* R) D5 D7 R7 h9 E2>alu模块
, [( r. e+ b. F. K5 balu模块,大家都很熟悉了,是执行单元部件,负责运算指令的运算工作。- f1 M1 r6 f; ^3 N
1 i" \6 h# X2 h# A; Z7 x7 ]这个模块的输入信号是有控制通路的解码出来的操作数和操作码,输出信号就是运算结果。
- ?& p, E7 e3 X% P4 v- |4 x3 ]7 j/ F0 E
( Z: l" `. R: z- x, ~# [需要说明的是,这个模块可以完全是组合逻辑电路。2 T7 H# R3 L/ Z* @ i# Z: L( v6 P
+ ~$ g' p' \. x! z+ ]
7 E% P) }4 B" E
; e. ]5 z$ D) ~$ V& O) V3>RF模块4 a4 S% p& f0 W, h2 f- b
register file模块,从物理上来说,就是一个block ram。
& H4 Y* Q7 H, O8 C5 {. l
- `. G9 F( n4 `) |. d从逻辑上来说,这个模块是对软件程序员是透明的,寄存器堆和指令集是软件和硬件的交互接口。
: V6 b& q& j% o, W) d" v
1 w, f- x* ]% }1 W$ H' D; G
2 n% n8 ^; b ~; ^% Y
1 T- O) y8 x" H% ^4>stack
9 U* @ R$ r y% ^stack(栈),是用来处理分支指令时,存放PC的值的,比如,我们在处理子程序调用时,需要先将当前的PC+1压栈,等到遇到子程序返回指令时使用。
# a5 p: r* q2 S- y6 M' ]5 s7 r( k4 }( C! c8 s$ I- I
栈的特点是LIFO(last in first out),这一点与heap(堆)不同。
9 C0 W" J& q/ J; h% @' _: H, b5 y1 n& r4 ?. P
8 t, v: j S9 b) n% W! o7 k
5 N1 P" W" [" r. \$ x5>ctrl_path模块
1 ]" e2 s' s+ [: u; w9 W8 I控制通路负责将genpc模块产生的地址处的指令进行解码,并产生对应的操作数,操作码和控制型号。这部分信号比较多一点。
& G6 L( C- ~% T a1 V" C2 z. Q' i* Z
' a6 M; T- K- V. j9 H
0 s$ g9 n+ L; A$ o6>tiny_soc H# F" E |$ q$ k5 X; \3 P
为了测试这个cpu内核,我们需要搭一个最小系统,包括指令只读存储器insn_rom模块,里面存放机器码。& u) q2 j/ ]5 x+ U
. Y- E' F. u1 t% O6 j9 G+ ]+ U7 E由于是harvard结构,所以还需要一个数据存储器ram模块,相当于内存。) z0 C% `9 T2 m/ |- O
2 ?( W# w3 E& r7 h
当然,如果想外挂其他I/O外设,我们只需要定义其地址空间即可,需要说明的是I/O外设的地址空间不能与RAM重叠,各个I/O外设之间也不能重叠。# K4 o( p8 m( [
. x6 e0 \ ] X W# X3 t sRAM和I/O外设之间可通过一个arbiter与cpu core实现数据交互。
, p4 P1 G O6 R5 Y# n+ M0 ~2 U d& K0 q3 z1 k" p8 ]5 a
当然,如果存放指令的地方不止一个,也需要一个指令arbiter。
% \! Q$ q, V7 b# @( K6 e
+ g# W! S" U8 l4 G5 E. ?0 y8 @
* f5 G1 B% ]3 u- F5 E
- H4 l `0 g3 g! L4,RTL实现& j$ h0 d+ M) z) I; G) D
在完成模块划分,接口定义,仔细分析考虑模块间时序之后,如果没有什么问题,我们就可以进行编码工作了。& H6 P- i7 m6 S* r
) ?! N6 O, d. g/ a# }2 ^6 N
编码,需要注意的是编码一定要规范,信号命名,代码注释什么的,尽量要仔细。这里直接给出RTL代码(verilog HDL)
% {; S/ Z0 u& c* z3 U
- p1 w* d2 h8 N/ K按照自上而下的顺序依次给出:: D& \! [/ C0 f; m) P
) }4 j8 ?+ c: B- q
9 ]: |7 Y7 |3 o* x' c1 ^5 ]
4 k \' r$ ]0 p- n( F1>tiny_soc顶层模块:soc_top
% o* L& b* t4 Z+ x+ k+ S0 S6 p
2 j4 L; H8 P! T( ~7 I- z0 y
; N0 B: ^; H% \" J8 i- l
" p- O7 ?2 u+ g! i( a/*
0 t" B( [" E% `7 p*
/ W$ N8 M" w* `6 y4 [0 h* file name : soc_top.v9 g0 T8 r" O( G* J
* author : Rill5 `! q2 ?$ O* M' W; I- L+ a
* date : 2013-08-11
- a k1 b, F0 M! X# B7 f*
J4 `) r/ @' n4 t8 Z: E- U*/ |8 V" ] _% a
% ]3 U1 o% I! Y1 A; B8 J+ C`timescale 1ns / 1ps, z! M% [2 b- {+ ~2 u' e2 w
( F, k4 X1 }0 I1 R% C7 D7 Y
module soc_top
. m2 \. A1 S o3 A$ q9 Y" o(
& E1 \/ k- G( `+ q& |; iinput clk,4 h M; O, w3 L) f+ v: A& H
input rst
l- @0 b+ K$ s$ M$ X. n);; V- b8 h1 ]8 b5 U' q
- y D2 P7 f. t" i* @4 T" E/ I / L/ B, g/ w9 I- i
wire read_e;& v) b) F* k2 U1 U0 K3 ^1 A
wire write_e;4 h9 o* l: C' X1 Y0 S
wire [7:0] port_addr;9 j! H& }' i$ Q7 z6 d
wire [7:0] core_in;: h4 u, E7 {9 R5 z; B2 P9 l
wire [7:0] core_out;
5 c# s q1 d! n2 T6 h/ i) _wire [15:0] instruction;
. k0 }# |7 t: \% f+ T/ Hwire [10:0] inst_addr;3 X& P$ T" [$ o7 d) G! ^! C9 v5 U9 P
9 s3 R' m/ l/ Y A3 e+ Q! T: I; t1 awire [15:0] debug_insn;! @; s* j; y" V9 m% h# h' l
wire [10:0] debug_pc;# b" {' v! C2 D( n# i3 R
* e2 x2 A2 }7 U# q7 O# ^/ ]9 kinsn_rom insn_rom7 }8 V. D2 Z$ e" H+ |
(9 P. x# ~" I( h9 t5 H+ B" w
.clk (clk),
7 D6 Q s& ^$ W# e; K.rst (rst),
; g- x* n& o5 Z.address (inst_addr),
0 {7 i- l6 K9 U# @4 F- ^.instruction (instruction)* q, T7 |0 a: c9 a, ^% Z* ]
); Q3 p `9 K. W
, D0 e9 g* ?5 `3 e: H+ i
core core
8 x) m3 b. q0 e(
% ~- I. ^8 a$ C2 a$ j) B.clk (clk),% n& u/ {1 r6 {" y# y
.rst (rst),5 _; Y4 n" G1 Y/ e+ O+ X
; T; L% l9 M% ?, t2 o4 q, p
.read_e (read_e)," d L) x# D; p8 q0 a4 q% e& a' ~# t
.write_e (write_e),
( v5 c1 y- @: C1 C( ^/ [.port_addr (port_addr),: W1 r6 M( f0 U7 J' w' n
.data_in (core_in),
4 _7 \* k3 C( l9 x% ]( q.data_out (core_out),
3 J: S5 L d# c9 B$ d7 F8 O0 E.inst_addr (inst_addr),! v7 C0 ~' D+ F# \1 ?
.instruction (instruction),
$ A% @' o1 W% g2 i2 f2 Z.debug_pc (debug_pc),
! h% v& k2 I9 a# O. j" R.debug_insn (debug_insn)3 _; ~; W W* \
);
$ M! _+ V! q$ L, @' m4 {% `
9 Y% K3 V) H5 C- K( n5 a" Iram ram
, a* m( D' @$ q2 s% }( Z7 h7 M0 ](
; G. Z3 m: y+ L7 O% B.clk (clk),; g, b+ R* H4 g
.rst (rst),
6 b6 i) u: N1 _8 {
# h. r8 G8 g1 Y# }, P.wr (write_e),% {0 U* K5 k1 b2 Y+ R( r4 q9 i( W
.rd (read_e),
" _2 l+ n2 ^" m7 X, J) Z! A' `.addr (port_addr),
# ]0 t* f5 C* k2 N% c" Q.din (core_out),* Q2 `7 L+ `1 u7 |) u9 A& c1 o
.dout(core_in)
5 m! q F' T9 W1 S X9 x);' R( F4 C: Y: f( C3 ~! _
3 y& A4 m- |5 Q& L
& p5 J; A8 U$ G, B8 |3 [1 x/ B
$ @) E2 z3 w. X7 T7 W
endmodule
$ X3 W# _0 ?- `4 n/ p5 ^% w {1 K6 e; B" ~
; @2 @ M$ ^/ L
. {6 |5 U8 g) p+ k
0 I: x+ t& Q9 W% `
2>指令存储器:insn_rom
! a' G- D" G" y* v* ?) A" ? U0 h, [. s4 F% E( E
7 j9 j# e s9 p/ t: s% ^: z
m- _; U0 c+ j- W" a4 G/*
. W# H, q9 a& B4 _$ _0 @& \*
7 l {5 a6 d. ?3 M! l* file name : insn_rom.v i# F4 J$ K" h, W
* author : Rill' u, u) p: y0 S, Q% ?
* date : 2013-08-110 T- v3 V& X: u
*
. s2 v, `$ T) }2 V7 y: f*/
5 K+ k) l+ h, f" C ' h1 L4 c7 E0 [& T# {8 _
% p6 ]# G' x; ~5 G
0 ^2 b! n( H% I+ K6 z! O
module insn_rom+ ?) a1 w) Z9 X8 r1 r7 f
(# @, W8 T& N3 \/ Y! p" W, l& A
input clk,# l5 t4 G! p1 B$ ~$ _/ Z- v L
input rst,2 W- G- W- e' M8 K. s8 |% ^1 t% e
input [10:0] address,
- M/ j/ V- a. v( p0 y2 w) Voutput reg [15:0] instruction! g% _/ m" m: p$ [+ \1 w- a8 [
);6 I3 s, R" c8 l+ l* K
+ [* }# Z& A9 T. y
//(* RAM_STYLE="BLOCK" *)
6 i: d) c$ R/ U' L+ H* s2 preg [15:0] rom [2047:0];9 C6 s6 X5 Y$ n+ r# T
8 x2 N1 i* T1 R$ o& L- Aalways @(posedge clk)
7 y- |0 h2 T) l4 f; jbegin
5 W! Z+ Z, L G" h' u; y. c if(rst)
$ @) u3 e$ _4 V( s* r begin
( j' i& x) b1 Q( a: U @. s' ? rom[0] <= 16'h5801;//0: jmp start
5 }( o( w. A- K0 M0 v( ] w rom[1] <= 16'h1101;//1:start mov r1,1
7 x0 ^9 y$ S ]% p8 b' K% t rom[2] <= 16'h1202;//2: mov r2,2
/ P/ ~/ {: }3 \+ [# s! n7 ^- W rom[3] <= 16'h3220;//3: add r2,r17 _7 J0 _" l2 W4 _# A
rom[4] <= 16'h2237;//4: str r2,557 ^$ L+ h. [) d3 l6 U1 i
rom[5] <= 16'h5806;//5: jmp end: f& l* w) O: [" K7 ~
rom[6] <= 16'h5806;//6:end jmp end*/
% \2 B4 _0 y8 L5 ]& I7 a) ~0 w9 b% n end/ Q1 {& F5 H% ]" H% a
else6 n3 t% [! i6 E+ m, ~0 m- S- l5 F
begin
6 H* |2 ?, r5 M9 \% R% H7 F instruction <= rom[address];
_8 |9 E/ F/ ?0 n end
4 R5 A ? E- ]; Yend
B) X2 c3 z8 Q# p2 R
+ D& R# T) U' x5 T
- s2 D' r; I- q. rendmodule& k+ s6 v, k0 s% h6 t8 T3 p0 u
5 L `3 r) S- N# d* X: V# N! I f; q8 |5 J$ n3 U1 a
3>数据存储器:ram
8 ^8 h" }3 E" I4 N) G! W( \0 m% m7 Z8 r
9 L+ Q1 K! g6 ]# j: C ~
, G; h9 r0 g! }% N6 s ]
*
: m" p+ F5 i, U. p2 q# j! K( w, g*2 y1 f- x3 z# l* s: s" v/ }$ l: n
* file name : ram.v: Q5 k2 Y% q$ T5 F* d4 ?
* author : Rill+ l' R4 g* n6 {5 s
* date : 2013-08-11' b- f/ o" L0 R4 G8 P9 x
*
' x$ \' u8 t+ I*/# B+ ~7 C, l# n6 U8 _- V% C& i( }
5 u9 |. N) V7 M& g" L6 x
* N* B# r, w0 W2 m
module ram($ S8 N! z: _$ s4 G* n9 i: n
input clk,- H, C6 m6 l: H3 Y' }
input rst,) c8 A& t; X$ J9 K- @
2 Y0 y! m; P* x r8 G4 k input [7:0] din,
5 p! R! W# F \* \0 ]: V input [7:0] addr,
* G! ?( |' b8 K. Z* l output reg [7:0] dout,
- q: g; a$ d: z4 m input wr,) E( W8 n H. l$ A( ?
input rd9 X+ c p1 @5 z3 W' ]2 I
);
* Z3 H4 _. ~4 `/ K b1 c& y, @6 q* k
(* RAM_STYLE="DISTRIBUTED" *)1 [4 N1 H& g* {2 g4 P/ s9 e$ p1 F, m
& k/ k# D. O$ y: l3 |' s: d
reg [7:0] ram [255:0];
7 O* J8 f; u0 k) {& ?
' e+ k, M* n5 Z' T1 o% i always @(posedge clk)
0 ], [6 q9 t7 G2 d+ t; P' [ begin
p. A2 n' J ]- T& ^ if(rst)% r! N6 I; C' Y4 d* E: Z
begin
' n& l) H9 b2 s& h# O dout <= 8'b0;
5 I6 k. Z0 {- W& J ram[0] = 0;( v* P* ? S( F, a) k$ M
ram[1] = 1;
0 ?* _0 `) p2 u& J6 O$ @ ram[2] = 2;
- S7 H7 @. x6 L+ a ram[32] = 32;
# E5 ~. y4 o3 |& ^4 ~0 |; _/ ` ram[64] = 64;% D5 X" z' T1 C2 |6 w" Y
: [7 R+ M- ^8 L" a- e9 F$ e end* V# q1 {2 ?, i
else
- l$ ~& |; X3 F1 Z" G5 B6 _ begin
# q1 G5 }( R# z if (wr)& U1 W( k# F$ P. _4 L/ A8 x6 R5 O4 e
ram[addr] <= din;2 X! a8 C9 l/ S# G4 a+ Y% @. U
else if(rd)
; d) K. e5 ^0 U9 @: { dout <= ram[addr];- a2 Q- Z) b4 U
end# o6 U) P1 n: U$ K0 Y
end
# M6 s3 z9 m: N0 V! w4 a$ f
! r- [2 Z$ w& Y6 ~, I& Vendmodule
1 u- J! w' i8 S
3 e' A3 M4 }% I% N# [
0 p6 u8 G' E7 S% C4>CPU核心:core4 R8 P. e+ z3 s m$ G# O' V
8 E' @# p6 M. p6 v# `4 Y( s$ O1 {* |" n
( g3 @( U+ I2 @! W
/** F/ @ `& j8 a- P& x
*
4 D! m+ q5 D4 a, N* file name : core.v
6 u! j. w6 Z) {: C* author : Rill n) M& { D4 [4 w2 T
* date : 2013-08-11
9 F( v9 g& v/ e J( |" ?*/ {" z$ E7 N: a' y% t
*/
" ?, D. o8 B6 @3 w _! `8 N, v4 b) k7 P' j
2 ^) ^$ z. m- K+ r
7 y/ E/ w( Y0 F3 a# B+ T7 Y! a( c5 mmodule core
9 Y3 n3 m$ ]3 o, y(
% J1 _/ \( y( g, Y input clk,: [, H$ G6 k9 f, W
input rst,: D' l# C, s4 ?6 o& Y: [0 z; d- T
output [7:0] port_addr,
# D0 w4 Q3 Z1 ~& r9 C( o8 L output read_e,
6 M+ x2 H# B; \" a+ e' g7 D4 E9 Z output write_e,
5 r/ g# D+ y1 d3 C k input [7:0] data_in,$ B7 J$ M9 O$ [8 T: t* s0 O
output [7:0] data_out,$ D! |! k4 E3 p, H& ?( A: X$ A; R
output [10:0] inst_addr,6 D4 ]/ `8 D( j- o3 I" D
input [15:0] instruction,% k: r0 c4 \3 Q+ V, C9 j
2 j: f" e/ B2 Q% a" v output [10:0] debug_pc,//debug i/f
B, t1 [. y$ F6 O7 s( y' m output [15:0] debug_insn
! ?5 V' D6 I# Z);* G2 v7 R l6 z0 f7 s. |. g4 F7 v
4 ~% w4 n, C& M, j
wire z,c;) U0 o6 L7 K0 J$ Y4 u
wire insel;
4 O& b& b& [2 @- W3 f; p; Nwire we;, N) m9 y* N" N# a5 R& N+ n
wire [2:0] raa;& a. C$ W4 X* z: H
wire [2:0] rab;
$ r" R, v; Y. I9 F8 _" Gwire [2:0] wa;7 z! p% W+ V+ ?* }
wire [2:0] opalu;7 n- a9 W0 k! M* g9 H R+ O
wire [2:0] sh;0 b$ o2 s5 i) @6 k
wire selpc;1 T- q S% z( u* h# X8 I D0 i0 H7 V
wire ldpc;
" B" j% r# B. G' ]& O2 z/ W9 ?wire ldflag;" w: G5 R' b1 C5 j" c
wire [10:0] ninst_addr;
: w" a4 F: N0 I8 G# ?; w. u0 Z ?wire selk;9 e ~5 t8 _/ B2 W0 i; q9 f
wire [7:0] KTE;, l* V' v, |( Q' Y* P
wire [10:0] stack_addr;% S. o' U0 f6 W, w M8 n
wire wr_en, rd_en;
1 D2 r! S+ j9 bwire [7:0] imm;
: T9 O' M& ?. J0 w% ?wire selimm;, \0 F4 I# R4 F7 }6 \% ^- ]
. Q( T, \" Q' v: `( t1 {4 h
1 W0 N) ^/ W% r q
& Y4 y" e$ Y" C& V0 b
5 z$ m% w6 b% h- d0 H; Kcontrol_path control_path
8 R1 F. v) Q6 r1 ~; f4 E(
0 [4 p4 Z/ S9 _& r.clk (clk), @ U: O5 t W8 W3 T1 u! e
.rst (rst),
K# [$ J$ O4 i' @% }6 N.instruction (instruction)," l' ]# }' C' Z# S/ N
.z (z)," g# e1 w! U/ ^3 Z+ S& ^8 ^
.c (c),
" Q% T; W/ a7 q* x* }.port_addr (port_addr),
" x' p; C7 J( U3 s.write_e (write_e), \7 T2 D% {) a7 |/ L/ C+ A3 l
.read_e (read_e),1 r9 T) a& u5 |0 D: ~
.insel (insel),; ~1 E9 o' T9 J: |
.we (we),0 B; A* b& Y8 }5 J% P5 Y
.raa (raa),
+ h( S& u6 A3 u! T0 `9 k.rab (rab),
" D: `& Y, s) q! p9 d.wa (wa),
$ [* {6 w: q7 p! s2 V.opalu (opalu),
0 {+ d7 T7 }4 Q D/ y.sh (sh),
9 E/ a* z/ t7 c; x$ V.selpc (selpc),/ G" ~* e9 r5 A2 {% i. D
.ldpc (ldpc),
7 s+ N1 u* h P9 X# A9 F( v.ldflag (ldflag),; T. R5 M) f, x% f" R
.naddress (ninst_addr),9 `- S4 V5 a- x& _
.selk (selk),
1 g+ W+ k: x0 q5 \7 Y! C.KTE (KTE), K3 D5 L. B% x# l
.stack_addr (stack_addr),
& v0 u( M0 i7 ]4 A) n1 _( l.wr_en (wr_en),
( V- c% g' p( j.rd_en (rd_en),
% k( `# \9 P* Z* @# x+ y- ]( p.imm (imm),
5 a& @6 R# Z1 w, h& M* y.selimm (selimm)$ f* h8 t$ ~2 B5 M5 `! ^" \
);
w6 {! r4 Z" q' A. h / w8 o4 n; w, X- H5 m! ~0 D; S( F
3 f4 y2 \7 F6 U/ i 6 x/ U$ R: y1 W6 h2 r8 y3 Y; _
data_path data_path_i! g+ e$ M5 \% |$ F; h, o+ p
(8 w6 }9 _+ O5 Q/ `% `/ l) Z
.clk (clk),
' A+ [* F# k7 {3 e$ d7 U- |.rst (rst),
! B+ E. v" I. I. j5 a0 r.data_in (data_in),
! I2 E1 _% i% }5 X, ^2 y.insel (insel),( G4 V, F: v, f
.we (we),
1 s( s( J# @, f.raa (raa), T; i0 {+ {$ Y2 G8 B
.rab (rab),
3 G: k o% I- h U+ D.wa (wa),
5 k$ d- `2 \- J8 l.opalu (opalu),8 ?+ x9 X6 [" z, {( l( M
.sh (sh),5 q' x7 v" n) A1 B$ e+ b
.selpc (selpc),) d# s$ U8 e1 r5 D" T
.selk (selk),$ F. z" K0 ^# h) U- s
.ldpc (ldpc),; t1 D; _6 O! g E1 ~. U
.ldflag (ldflag),
7 [" Y1 r* O- w g.wr_en (wr_en),+ D5 T% A9 U/ O
.rd_en (rd_en),
: d( j3 I! J' V9 A5 S9 l.ninst_addr (ninst_addr),& P9 F! Z3 o( p5 Q$ S" u4 `0 _
.kte (KTE),- `) n, U4 b/ ^& [/ @8 r$ J+ L7 o6 w
.imm (imm),9 F) \. ~; g# S
.selimm (selimm),; N3 {6 q3 h, W" e' [8 g
.data_out (data_out),7 z# E2 g) k' R+ ]
.inst_addr (inst_addr),0 M; I% m# F' z6 A. b
.stack_addr (stack_addr),
: ]( J' Z4 h5 E( t, e.z (z),
+ Q5 {3 x/ N, m- z7 p.c (c)
' ~0 ?" V+ s6 w$ X6 l/ w& w& k! _8 @- {);' h( \" |7 V! y+ ?
) G3 v1 Y) ~+ V. c, Bdebug debug
% q: l5 H0 v5 H/ N(* C9 j0 J# q' Y$ O0 ?
.pc_in (inst_addr),% S, M6 k) n% Y4 t
.insn_in (instruction),
U7 t0 p( v; v; \- H# f
$ v% b3 }, v. O; t.pc (debug_pc),
7 O& M: ^# ?* }5 @4 v' [ g.insn (debug_insn)+ `4 F% E% O4 K. a5 H% c( }
);# X. t; {+ L4 u" l- [+ r8 p
/ n8 A, P5 Z6 Q3 [3 I* g" y+ I
( J* S& h2 P( T7 f! P/ Uendmodule b) P) o! Z3 O C
5 Q; i! C4 P) ?! W- d8 l8 p1 m9 n# l9 u& A2 R. H
5>调试单元:debug7 u' `6 G$ Q* }: v$ H. q7 {# g
/ ^4 g/ }2 |/ c. k
V0 m1 L: Q! G3 \; w i" Y
5 E5 j* _$ p" K4 V( |& @/ i" c/*
) z. k" r; G P- ~8 C x: L2 O*7 u! k& A) L" t0 s1 L
* file name : debug.v% e' o$ b' a1 ~1 q w
* author : Rill$ }- x8 A8 j2 d- b( J* w) \7 U
* date : 2013-08-11% |; q4 j! T1 ]/ R
*2 f a% J" f1 `' D
*/0 \; y* G; {8 X8 K
: ` d! O. ~% ]4 f4 |: U' m; a+ V
# [4 [, q+ H8 `" Y- D' a $ T! C, q2 A b$ Z, X% N+ u
module debug
& @% n7 R2 V1 ^+ g(
, V$ J/ b% F8 b8 O/ T; yinput [10:0] pc_in,2 f; t- |4 d) W
input [15:0] insn_in,4 P! Z* K1 \2 p: N
6 z3 p2 W: h: H. r; {$ h F6 coutput [10:0] pc,. a* p1 K) O1 K5 e( Q* X: E! Q8 C6 T
output [15:0] insn5 L8 K, _& S3 [0 ^
);
& ~& H9 c* |: p$ V+ Z. V' ? ' N6 X- c! L8 J: x3 o4 w: F
assign pc = pc_in;9 w7 V0 \" n" z- v
assign insn = insn_in;
9 n3 w5 z6 h, M+ j. `. v! d
5 N) A9 {" p0 @! `! i( lendmodule
, j- R2 D9 N' r; ^2 I; T7 a1 E% r1 p7 _
1 x/ U6 @- l9 e/ _. M0 Y6>控制通路:control_path% W& X# F/ e. n5 I# `$ E
3 K( C% S, T& o5 \/ \' M
3 V6 q3 @2 P4 U1 L# ~5 q
9 R3 q! X6 R' F# _/*1 R; W" Y3 @/ ]; k2 F
*# R! ~: C! f4 r& g$ n! b
* file name : control_path.v5 e( J) @0 b0 T n
* author : Rill
/ l% \" D$ v0 o: I+ [' b. f* date : 2013-08-11
" _6 }& j% H8 }/ h" s1 c' O, x*8 p+ D4 |' k! g; d y B
*/: A( ?, y4 a0 ?2 c- h" v1 q( V
+ R8 R' \ w; Y" k' n9 \0 E
7 w" |1 H, J8 Q: s/ D
0 n* z) o V. T
module control_path
6 f) H0 g. X; c- k(
6 z- m7 ^/ ?& \; Y input clk,' t0 `! V& L0 F8 [- W
input rst,. U% G- E$ |, `
input [15:0] instruction,
+ ~+ P1 {' p, W$ r1 P1 z input z,
2 F! s: p* N9 F. q. { input c,
: I; R2 R$ F3 x3 X6 a output reg [7:0] port_addr,
: c! z z9 e8 X- m8 F' C: _ output reg write_e,
1 @* T* o( L, U" F output reg read_e,
7 r0 E) I" D- b" G7 z' A# _+ J output reg insel,
* k/ _. |! j/ o0 M0 E6 X output reg we,
. C6 h* j/ x1 d( `" b4 Z output reg [2:0] raa,
* A# @" e2 k3 m& _1 L _ output reg [2:0] rab,2 c( a$ [' f- M, ~6 n; N! U3 l
output reg [2:0] wa,
9 F2 ?1 y/ ]. s4 I+ C2 O, d0 F8 I# r output reg [2:0] opalu,
" Q' J* g& i E% Q0 _- c output reg [2:0] sh,1 M3 i8 q0 g! S; h
output reg selpc,
9 i. ], S2 w; ]3 @0 ^5 c output reg ldpc,
" f9 e2 t' L" _ output reg ldflag,
\. H& K: [8 t- \ output reg [10:0] naddress,
% }% v6 T9 p3 w3 k, H output reg selk,7 V0 P2 s5 H( V8 D, S7 H
output reg [7:0] KTE,4 u' a! W" A6 h, s1 F' _6 K* m
input [10:0] stack_addr,
: z, ^5 |$ `) `7 w0 t' ~ output reg wr_en, rd_en,
0 ?$ M; r0 C* \4 C6 p output reg [7:0] imm,: [3 y0 \) ` Q$ @& y0 r
output reg selimm
, V( C+ c3 Y& R. A );
z$ R- V7 x+ l$ C1 t % J A( P. E% [9 ~2 `
6 [* v+ \; m$ E" ^* E0 Iparameter fetch= 5'd0;
' s8 S& U L7 [# Kparameter decode= 5'd1;* c$ m( f9 D4 E6 m9 k4 O2 Q& K6 `% {
: Z: [8 A3 e' f' _. F
parameter ldi= 5'd2;% ^+ d6 `( a3 H* {6 B
parameter ldm= 5'd3;
l7 S1 u% F: t' iparameter stm= 5'd4;6 o/ [, k* C) M
parameter cmp= 5'd5;* \5 H: a! |0 G8 ?+ k$ d) K/ C
parameter add= 5'd6;( r+ r5 }3 _- ^" h9 }
parameter sub= 5'd7;
% w# I \" k. u* Gparameter andi= 5'd8;8 t o7 U: \9 Y
parameter oor= 5'd9;- i; A/ N/ c& _ s2 c. O8 `
parameter xori= 5'd10;
* c' h, i: W% k0 c" F. y. Jparameter jmp= 5'd11;: \" N2 N; M& j' f# T9 l4 F- I
parameter jpz= 5'd12;! ^' |% f5 n2 y# {9 m: I6 Y
parameter jnz= 5'd13;# o6 K& a5 c+ a- x% P* K
parameter jpc= 5'd14;
2 T/ [6 {. h& j5 Lparameter jnc= 5'd15;
: t0 G) Q w" n; A0 Cparameter csr= 5'd16;- m1 a# `$ i$ y" q9 @; q
parameter ret= 5'd17;
% d2 |. P7 k- Q! z1 f0 @
* j$ Y; |$ s/ I' ^parameter adi= 5'd18;/ g/ f' ~3 V9 C3 V5 y
parameter csz= 5'd19;& ^/ b+ D" y8 |
parameter cnz= 5'd20;1 \1 _" W. G9 C5 ~
parameter csc= 5'd21;
6 H1 d2 B2 V1 X- W- F% oparameter cnc= 5'd22;
* p9 i" W# B" H1 d# D3 Oparameter sl0= 5'd23;" J# O8 F4 J& ]
parameter sl1= 5'd24;' }" j- a. p A8 y; o
parameter sr0= 5'd25;
; d$ r: t6 z0 [; l+ ]2 K- p) Iparameter sr1= 5'd26;
3 p/ i( _5 Z! a2 E# Q1 j7 E* B0 yparameter rrl= 5'd27;" F, }' y A0 H1 v0 K
parameter rrr= 5'd28;
( Z* K- R) u1 b( o1 e5 zparameter noti= 5'd29;& O0 U; Q9 _ u
' }. i+ b% ]0 q A/ k: Aparameter nop= 5'd30;: `4 _9 N3 u$ K, b+ i; `
6 |* R" n- j% {3 O) D; ~$ b: awire [4:0] opcode;( `! @1 S, ] L0 h) j! r
reg [4:0] state;
& q+ ^9 X0 w% C& [
( Z* Y" e' x4 ]9 Uassign opcode=instruction[15:11];! e/ }1 u! |& i$ a
2 @8 X* k/ o5 r: z
always@(posedge clk or posedge rst)
5 N1 U7 Q+ ~* X: K; Y P8 obegin
* Q" h$ x+ o% z R8 ` if (rst)
- S9 E) ^7 M% c3 A4 M begin
6 D! |# k& k B state<=decode;% F8 x/ R s# ^: [
end( n7 _8 P2 j/ a. ]
( _0 V0 p. @4 D- d, ^
else [; L9 u1 }# u& V+ p6 Q
begin. b: ^* p- b$ t- E1 G
case (state)7 a% X. a4 L; P) o, R
fetch:
9 ~( c; n! y1 ?8 a+ v7 l begin2 J% {# t7 N4 `2 `# U- d2 c
state<=decode;
7 |7 ], Z; T7 `5 W: L1 \ end
1 d7 m- Y( d+ c3 g1 \ 8 v% h' _# x8 d+ L- \! X
decode: ' k8 q ~; @9 W/ f U
begin, Z4 _) y( v/ l# A0 M7 |$ Y
if(opcode >=ldi && opcode <=nop)5 O! ^) t5 O# w* {
state <= opcode;//state just is the opcode now
( x, q e) B+ e else/ E$ g! x! X; s- r" ~3 ~
state <= nop;, W; u5 j* G, |4 J
end6 b6 A4 [, u" E7 s2 B
( Z1 p' Q. E t0 _! t. d- d9 O) E
default:" N/ R+ ]3 M7 r! g% N
state<=fetch;
& \1 g8 t& r: O9 R& T endcase
) @4 U5 e! R/ M. {1 q1 w* N! ` end
- e2 S: @; d& z1 A& r. O( C
9 f! L. O( Y: v: w; vend 3 n5 s8 {4 G. v2 [9 f0 T
( p, d+ M; \/ K+ \4 ?
3 p+ T0 w# p7 k/ V% u& ^5 `2 N2 W
always@(*)
" f, C9 U8 [: x% }$ u, }9 z9 tbegin
4 U6 Z y+ I- v& g9 e* q port_addr<=0;
/ E! q" v2 q6 T write_e<=0;: h& c4 o F9 |) a5 {* X
read_e<=0;
: E, z' C: x% X) s% e8 p4 M: h insel<=0;- g! h% r! W+ `. S R) g9 {5 R
we<=0;
) T. U3 a8 u6 i) O; ` raa<=0;
4 _, d8 N5 C( S rab<=0;9 r* c5 o- y8 `* K3 J* {4 f
wa<=0;- i3 T( ~' D: W( k
opalu<=4;
, q# k6 I6 c; I# W sh<=4;( @1 V6 ]' Y) F
selpc<=0;
& n5 n" L+ I3 X+ e) o# y O9 w. U) a7 p ldpc<=1;
) o* v4 b) m3 x& k7 M ldflag<=0;4 K. D6 Z! e. t! L1 |; y+ q
naddress<=0;/ S* D& l5 A6 Z7 h9 J+ `) V
selk<=0;
j8 n1 _2 V9 {) | KTE<=0;
& b# M9 Y3 V8 h# a3 @* J1 B7 E wr_en<=0;; I x# w% V9 P9 d
rd_en<=0;
% C4 e* ^8 x" Z5 T5 Q- f imm<=0;
. l8 P6 M& B0 [; X selimm<=0;
% ?. s4 [/ w7 k6 C8 v! h2 w ) c7 D6 y# Y) v6 \- W! `
case (state)) z% M& h. ~( i% E1 n3 U# b
fetch: begin
* Z; Y: X) B4 d; P0 u ldpc<=0;) U# J; _. U1 k# S6 Y4 ^# ~
end$ \( L2 r) u& f+ Q
: \- I1 Y/ d: r& l6 L
decode: begin
: N, h! s) h/ G: u- w ldpc<=0;
, L! [ @- N0 s. m8 |; P! V( r$ A if (opcode==stm)' `4 ?1 ]' @. i; w; |
begin$ W6 S! C4 O2 \' P4 c. f% f& [( D
raa<=instruction[10:8];$ r0 B1 N* o$ T2 ?5 _
port_addr<=instruction[7:0];7 B. t5 _! w. X4 B" s8 Q1 J: x
end% Y9 A4 G+ z d ]& o
else if (opcode==ldm): }4 _1 G7 r4 o ?$ g; l( H
begin7 {7 Y3 e9 C* ^, A' o5 h
wa<=instruction[10:8];: E- l9 s( ` {8 N4 ]5 I t7 S
port_addr<=instruction[7:0];
) k9 d3 M$ K( @6 ` end! w5 d- s5 j: T/ o
else if (opcode==ret)9 i: {& Q3 `/ P
begin4 q7 E/ s. ]5 Q5 ]5 v+ Z
rd_en<=1;
) L4 S. R4 z/ f1 j1 b- ?/ X6 D end5 [. K3 f! _- [" |; B; |' B
end
: l% Z# k8 G/ {3 l; r) p
0 X4 u3 |, I/ f9 j4 o9 j ldi: begin
! x8 V/ X5 i8 a' j2 d selk<=1;' e" i3 }7 ]! i. l0 {+ B
KTE<=instruction[7:0];
; c- ~) n5 @8 x we<=1;. Z9 {5 _. T4 p
wa<=instruction[10:8];7 t) c) P* W# F
end+ G* r3 q& G8 x
I- Q3 z0 t b' Z5 I3 V S& N
ldm: begin" M( B" P$ A- H- Z
wa<=instruction[10:8];
9 S5 l* d8 x h8 q, l: j' V we<=1;. y9 v& L5 I7 X6 \, o! ~
read_e<=1;
' x+ N+ ]( q( { v9 a; k6 ^ port_addr<=instruction[7:0];2 P" {7 c% n, b; V! I9 `
end
/ ?; w/ }7 p; t% a8 r8 A0 U
7 e$ M2 M; z4 h stm: begin
6 {$ X. W$ N) ~ raa<=instruction[10:8];
2 r) X# e8 {- K* @& w1 ] write_e<=1;
2 y6 s! Y, J, E5 }, B7 z port_addr<=instruction[7:0];
+ H9 L8 O1 m) e* c end
0 b7 j' Y# E a3 v# ~ . {! k1 n6 O# B2 o2 c+ n% } `
cmp: begin+ J- ^ c6 Q1 n% G' d. z' a
ldflag<=1;8 Y8 q0 g7 Q5 v. S; V8 q
raa<=instruction[10:8];
* J& j3 A" r2 W3 r' m+ P rab<=instruction[7:5];
" L9 y9 M, L5 L5 N& }" \) O$ g! q opalu<=6;' k* c3 ?0 `6 C; p
end, b, Q9 H X4 @2 C* e: [0 m7 T
% q. l4 \5 g8 y" x add: begin
" P7 b) H7 S; A$ ^3 n$ [2 Y+ O raa<=instruction[10:8];
% W* p9 s; \3 ?* p rab<=instruction[7:5];
0 b# E/ {: c- t) ^9 b7 G, V7 y wa<=instruction[10:8];; f; m. p) s8 R; j1 ], `; y
insel<=1;, B) T% U! I+ z
opalu<=5;
* ?6 e' u. F) ]+ l# q2 B we<=1;) G( ]6 V6 ?8 ]/ J7 Y+ t
end; C. J7 t; Y+ F# j* u) z: X
& h9 A) \8 q1 D5 ~5 H: O$ U: H
sub: begin
' w1 U9 o6 p" L2 H9 q5 y raa<=instruction[10:8];7 n x8 Z" _2 i* A& x6 E. g" P
rab<=instruction[7:5];
7 M9 G4 c, \' i( t. k( P wa<=instruction[10:8];) k1 ?9 [& b1 A5 ~! Y4 K
insel<=1;/ r* e1 u$ W1 B( u1 g
opalu<=6;
* n$ A n+ k7 R# B( G; b# f8 s we<=1;2 \: c }% i9 c& a; f8 e! H% O
end0 l! k3 B2 |& L/ }3 v( o1 ~ Z0 D
# ~# l( U- q8 z6 z( i andi: begin1 L' q/ w3 x, f" m' e. g5 L
raa<=instruction[10:8];
7 [ I7 w: ^. U: |5 s3 d! p, C rab<=instruction[7:5];
3 f4 u) U0 u$ `5 W# c' a$ u wa<=instruction[10:8];
- L. e8 I7 |5 m& G% r" S) D insel<=1;( t% w6 h! h0 G' x
opalu<=1;& s. n3 S# U- V! X# P0 i* \
we<=1;' i8 W% \" N' P4 ]
end4 J) U: d' C( T$ A
6 o8 p: A# k7 t4 ~ oor: begin4 t4 Q+ X7 w0 \
raa<=instruction[10:8];9 ?) c2 T7 a' R, f7 ]0 ~5 T3 v
rab<=instruction[7:5];% T! {1 L/ x" x- N* q% S
wa<=instruction[10:8];
; v7 @1 @$ |! m* P; c; f- I insel<=1;
?' A% e) F3 k opalu<=3;7 m! [# t; G- {/ X. X# L
we<=1;
) S6 W2 z+ \3 y4 V' N" P# H! k end
9 P; S; C P3 v" T+ y2 e' _ ' [1 x5 [* |2 v O! ^
xori: begin
6 x, @# ~6 G- I' m: B raa<=instruction[10:8];
' @2 ]' o( @6 J, d* M" q; d; q rab<=instruction[7:5];
( N o$ p7 Y+ w6 V wa<=instruction[10:8];
2 H; v. Q2 W& y5 t" |# y insel<=1;$ e0 w- ?7 C A4 y7 H& \# D
opalu<=2;" D: J7 k2 C% @2 M9 d& o% I) m
we<=1;
- F1 A& j: s7 a! k& X p& I end7 B) M' I7 J c- h- N0 @7 Q
# Z1 X, } ~( \, v2 k jmp: begin _3 e7 C$ L! f6 P! S1 q
naddress<=instruction[10:0];7 r0 E; V$ a) X. I/ ?
selpc<=1;
8 {: o/ k; A9 q ldpc<=1;, J0 Y, v$ r$ _% i! f) _
end
. m9 m; ?$ e: W5 u# F( q9 X2 c 2 S9 p/ K8 ?# ?
jpz: if (z)# x: ^8 Q% V# {' a! k
begin
; ~; P$ z0 |5 t. M naddress<=instruction[10:0];; E% p1 W' t' C
selpc<=1;
; W g1 ]8 S8 R5 s# \1 | ldpc<=1;# S) x# ^9 ~3 j5 a# v
end
* h+ B, |7 a ^& @' N' C: l ' j4 O5 c. D- z- x8 ]1 K! a7 s+ r l
jnz: if (!z)
5 D! f, Z4 J8 l: q begin3 z' E( ~; q) `' r! t; x0 x; r
naddress<=instruction[10:0];
. H# r$ C( A+ {% r8 o2 } selpc<=1;2 h9 D" S- h/ P
ldpc<=1;$ N4 u; K w$ y, M
end. f4 \: d: V* a2 F( y; z; u, z
$ p# I- j% D$ E6 \# J3 x . L7 o! }. O0 N; T) h2 x* v
jpc: if (c)5 D0 d" V- q! e0 v
begin+ O, _. X2 M2 h- H
naddress<=instruction[10:0];; x: K$ A* c! h. L0 p) D% k: Q5 P0 X$ L
selpc<=1;
8 E6 O, f, V. p ldpc<=1;) l5 C) f+ I5 `: I' v" O8 K; _
end
: `' y( K Z, y/ {8 x) G- |
4 O" k5 j6 U: z2 P( J, a9 N
, q! H! C$ t) d3 F* Y4 Q jnc: if (!c)
: N: o+ G1 {$ f' w* H. n- r0 Z9 j begin
i8 x: N- ]/ D. @8 }0 u naddress<=instruction[10:0];7 ]/ k, O4 O* u N
selpc<=1;1 V1 w- A, B, O, V- }& J, W0 j
ldpc<=1;; H' m3 s0 s, @4 E+ J
end
4 W9 @+ L1 R8 G$ ?+ Q3 u$ n / O' y [* ]; i1 H. x: E
csr: begin
: C1 S) m, O& m% ?( B4 `6 j naddress<=instruction[10:0];
$ r! h! S! }9 z selpc<=1;+ t/ _* e; |9 i
ldpc<=1; Z. U- ~+ @ S, r1 c& g
wr_en<=1;
4 [1 K p$ _3 e3 H) V' A% w0 ? end
j+ X+ ]7 }" }/ w , k& ]& F7 h6 n C, K5 ?* I# T" D
ret: begin
. {5 ^3 Z# P b2 U* V2 N; q naddress<=stack_addr;
& V3 f& Y7 O* t& L o$ K9 N6 b selpc<=1;' T0 d, O9 x7 i& r
ldpc<=1;
% @6 W8 z h; _3 w7 o% e end
+ E% M0 S" j- `2 M. J% z ^, W; q% c3 m8 p8 Y
adi: begin3 k+ u/ w. _6 h+ k- r3 W
raa<=instruction[10:8];' S! m* E' m; M8 {# I8 K. y a! t
wa<=instruction[10:8];
/ {+ b6 d% _$ v' f& t imm<=instruction[7:0];! {7 v- w/ |5 [% e9 X. M. d
selimm<=1;* F2 }& a$ O+ l6 s
insel<=1;
0 P3 f& f4 A/ l opalu<=5;% r# s0 r+ [+ c! {
we<=1;+ D1 ~/ m- H) T6 n7 v
end 3 v$ S! C' F* e% N; R8 c
/ m( d* l/ E" y csz: if (z)
4 B( J" D3 [ P# l* C begin4 c! \5 z# v2 V* ?5 ]$ O$ ]
naddress<=instruction[10:0];
! e% _& I9 n; E0 r& K selpc<=1;' L' }1 S2 j% f w" k( M2 n
ldpc<=1; q$ W1 T; K5 y# O
wr_en<=1;% W- l% s; ^2 C& c0 D# a I8 @
end
6 G! d1 Q1 u' g8 L8 E 0 C$ m9 l( A* j2 i! u. m
cnz: if (!z)
p( m/ I$ i) b begin
4 F/ Z7 x& u# _& A* N& f3 h naddress<=instruction[10:0];3 ~# l0 N: b w' Z
selpc<=1;
& t o4 k. {1 E' ]8 a& B! s& x ldpc<=1;( x7 B: j8 U9 y; j
wr_en<=1;0 i( m9 I: f Y
end
6 D# C' M7 U* K7 j N& _- q' C$ Q
. n% A; F" E" W5 c! ] csc: if (c)9 s* a) h9 O, U8 Z
begin
- W2 x, o- v2 W* z! ^( _. \ naddress<=instruction[10:0];
0 _, j2 o6 x1 |% @8 D9 |, H3 l selpc<=1;
( R* ^& W4 }( f. O! [( y+ R ldpc<=1;
' \$ U0 ^ S( S' z1 V wr_en<=1;
' i& I, w7 X0 ?( [' Y5 w5 k" E5 l end* ~9 a' G1 r. G: W6 j% y" \
7 P- ~( }4 L& p* j0 \/ m cnc: if (!c)
8 X) R- i. h4 J- Y$ N2 M" k# q1 \5 \ begin+ C' S+ s( g" z" q' K
naddress<=instruction[10:0];
: ]/ C9 q% i i3 O' u6 K, R# ~. H selpc<=1;" ]) S0 U8 _& P
ldpc<=1;1 o. k$ |" ^- K. t( H
wr_en<=1;
3 \* c; J, {7 R# O2 Y! L$ G3 j end
& m" I( B- }% L1 @$ I, W
1 D7 [ K. t: \; g( ? sl0: begin
( c( S+ R, O, u }4 h raa<=instruction[10:8];7 \8 @, }- P9 [
wa<=instruction[10:8];& i, `) q1 J7 b8 h: U
insel<=1;. w7 c! r/ |+ w) p( d4 w
sh<=0;* ^8 c7 {8 Y$ b8 H h
we<=1;
! [ ?; n) O) i. B; S7 l1 T end
* a% V4 C3 N5 [4 G. ?, \4 `( Z& p : N, T" I) I9 N- W& |
sl1: begin
2 [. v" s7 W0 i3 U% F9 t$ u raa<=instruction[10:8];2 ?. C) [) S# M
wa<=instruction[10:8];
! R& l" d5 e. s8 x* U# ]* w [ insel<=1;
+ W+ M% @& I1 A4 Y& d sh<=5;0 p3 J" @2 ]" ~6 _- e4 o
we<=1;
" a3 ?5 f/ I& p+ S* @+ h end S7 A1 p( U5 R' M' h$ V
) _# h1 H7 h4 z" ?( n
sr0: begin
+ {) X. J& d2 a( M) z0 H$ `6 ? raa<=instruction[10:8];- I r0 P; j# D& G9 }
wa<=instruction[10:8];9 v% f/ Z+ {( k9 A' S* e7 w
insel<=1;
8 j& s2 C& U" \ sh<=2;
3 ?3 G( D5 ` B: } m/ D we<=1;
C( R( S/ K0 \+ j! x end2 h4 M* e( ?- z2 O
3 Q% z, D N7 |4 k5 e3 n
sr1: begin
' @/ {9 ^8 v; `5 a" s7 }6 J1 v raa<=instruction[10:8];
/ \8 I8 q5 x$ O5 K wa<=instruction[10:8];' Y2 `$ Q: [; I" `/ F1 R+ y
insel<=1;
2 U+ d( O1 S% b( E sh<=6;
; H7 S" f9 }: D/ Z we<=1;
: s. X6 K* k, y3 h0 E# Y end $ M. f9 ?' d+ I' D; A
' X; y* E4 {& q! V9 J rrl: begin + C R3 ~% H* m$ y3 v' F3 u/ |
raa<=instruction[10:8];' J- ?0 X2 \: J* M( \0 e
wa<=instruction[10:8];* s3 n# p; b) @! {! o& X8 ?
insel<=1;
" R- T+ g7 P. `7 K k sh<=1;
) `% M; j C B6 `% T6 Z# ? we<=1;: f, o$ {# L1 J K1 [1 c; P
end
5 ?$ b2 Q8 G5 d ) j. s) b2 k5 Z
rrr: begin
- q9 ^5 z) T; [; l raa<=instruction[10:8]; k3 N, k E' ]" ^+ H- z
wa<=instruction[10:8];
: y; Z0 Y/ s0 T F- W insel<=1;
% _$ h$ G# G$ Y' A' i7 f sh<=3;
. S l K O2 n D) F we<=1;
3 h @ g% @* z+ T end
}9 J) c+ s" B; ? . ^; V# x2 w5 i
noti: begin" S2 C! I# q( b1 n$ D
raa<=instruction[10:8];
* q. Q+ \2 w5 ^( V4 ~( }) p6 c9 X wa<=instruction[10:8];3 ]6 t( V/ p% T
insel<=1;
( u. q$ Z' Q# T, I7 I& t opalu<=0;+ K ~" y1 Y( K9 a1 x
we<=1;3 `6 P: r( V4 ^1 X0 Z
end
- K: B( N8 q, Q2 l% C' l ( X) x6 ]3 o$ s" Y6 s6 Z2 D9 [
nop: begin
+ ~; [$ O M- N* n1 t! t opalu<=4;% H* J' `, A/ ~1 D5 M- ^
end 0 i! e" r" T3 H/ k
endcase
7 K1 E$ l2 B s `$ x5 ^end
+ S; J/ n$ n$ P: ^3 |2 L , O7 l, |+ S+ h( W& T
5 h' v9 z3 o* C9 T
endmodule
6 n, ^# s/ S( j# [% M; W. C
- Y5 e: a! [" X! {2 s
& b' D5 q& e9 q7>数据通路:data_path
& C8 _" R# A) @ e, m- n. _& Q3 z9 B4 k0 f/ d3 _
1 ~7 {( i9 f4 \1 M2 j, }% e; K8 z2 c* [) m a, s4 w4 ~
/*
: X' f" V, F3 u/ ]*
6 L0 c. p. P. Y& U$ B* file name : data_path.v4 Y! v6 P& p" ~/ j
* author : Rill# a9 k: R. G# ?8 q+ x% \5 H, W, H
* date : 2013-08-11% S! B- ^2 f) Y6 S
*
' Q6 y2 h& l$ L, G( `& I* Y*/
5 w$ {) w- D2 m & ]! q7 K- o# Q- l1 G4 T
$ [' D4 y* s" P; Z* j 1 C! A; H8 T) Q
module data_path
& b# P# q& q- Q7 V. v7 Y(
3 c- W% C7 t% I+ k; A input clk,
1 h2 o7 T; G* _* m: k( ]8 P input rst,- J" d% ^ P; u; ^/ c }$ |) [6 \0 Q
input [7:0] data_in,) t& p, Q; `7 }( D* w* q" Y U
input insel,' ~4 I2 d, g: @% o( L8 ?
input we,
: L6 n! V. f8 }2 [$ ` input [2:0] raa,
3 q4 A5 ~6 i2 q/ r input [2:0] rab, ~5 U) O( y0 y! X$ W
input [2:0] wa,
3 B7 k) r" j$ H, Y9 G) K input [2:0] opalu,
. {: f# U2 ]& {9 F7 r) J input [2:0] sh,2 o! k: J0 W6 e# L! Y; U& Y
input selpc,
% _! q. {/ g& w4 l# x" ]" p input selk,
# ?0 h: _* n- [9 c5 T. u& N3 M input ldpc,
4 H1 {" M! w3 }" L input ldflag,* F: A% Q6 B4 ^: o
input wr_en, rd_en,9 |% j7 X5 `+ \7 r0 R
input [10:0] ninst_addr,
5 Q& I; f$ V6 ?8 w. A- f- [0 T input [7:0] kte,
' O3 F0 e4 i) A5 p, H input [7:0] imm,
' Y; n8 I8 ?) F. T( z8 F* A input selimm,+ Y9 i: J6 _( Y+ Z
output [7:0] data_out,2 t; l# p0 e, a. y, ^% N; b
output [10:0] inst_addr,
2 I% t8 B( d* @4 }; t output [10:0] stack_addr,
8 Y7 r# I5 ?9 \& b, b* o% ^ output z,c& o3 |( b5 z4 B, e# e" F" S3 n9 }
);7 J: P! o7 `* L: d" X
4 W5 w9 b( C- x+ S0 lwire [7:0] regmux, muximm;' g/ L; C* H7 s9 i% z. l2 v( w5 e, E
wire [7:0] portA, portB;
+ x1 Z% c7 A0 c O# {5 g& w: x . r k$ Q! R( ]
wire [7:0] shiftout;; m# ]$ \4 a4 [" g* V& @/ V+ x
% u8 x+ A8 m# j: |7 b8 L0 dassign data_out=shiftout;# ^3 t: ]0 I0 A. y. v1 K# E# n
) f6 r- ]& r* L4 e9 L
. P7 ~5 g" j( c1 q) ?. ?2 }" ]genpc genpc8 i5 t/ V# {& o. h/ i: Z
($ ]* w, O# D; J9 o" L D
.clk (clk),4 `6 L3 b, J/ [. u/ e
.rst (rst),$ b; q9 d5 E& Y0 ?/ z* U" K
: J7 F" i& q8 F) c1 ? z.ldpc (ldpc),
t" b, T. }) Y1 m, L$ X9 j.selpc (selpc),; G6 {( e$ \5 m9 F! i
.ninst_addr (ninst_addr),- {% }& T# R: o$ V5 z
& W% N; N2 H( v
.inst_addr (inst_addr)! ]$ V" e0 x3 l1 E0 N3 m1 e
);
6 k$ K, y$ k# z( N3 @$ i) |
3 ?0 g$ J3 F" q. e5 r! F
& n- X: p! T# t7 Qalu_mux alu_mux# {, r$ `% n5 P1 g. C& }: Y
(
' J3 x: r6 }% v6 \/ R+ d.selimm (selimm),
, [0 T* s1 ~8 Y1 v( ?! }.imm (imm),7 W7 N4 v7 R; i6 B
.portB (portB),
& ~! t$ m( w3 W3 H, z O9 l2 `- I4 B$ B" G" q
.muximm (muximm)) M+ R( ?4 u& o: J l7 e) k0 e
);
/ W, A3 a6 X8 |
) l+ r# [) J+ v0 d/ `6 balu alu! V/ K# t/ b! s; Z
(
) I4 X* L2 D/ h: g* Z! {: `.a (portA),5 p! |! O. X6 F$ S3 M, ^( [6 H( h
.b (muximm),
. Q& j4 w& r2 O& W& \.opalu (opalu),
& v/ v6 k" s; I' P" @- Q.ldflag (ldflag),
' F) y1 |! f) R- l+ N6 M.zero (z),
) p' r/ \' Q' ]! Q! S3 I$ Q.carry (c),- ^" K) [: U+ t4 Q+ @9 Q
.sh (sh),
8 r3 g# V: n3 H& Z# U2 k+ b.dshift (shiftout)0 y- \# W/ a; u$ e6 B5 O
);
) w0 b: H+ g( ]6 } t ' @" S- h( J2 B7 Q! h
! a9 j+ `3 a* s$ u& }stack stack
* y4 ]# ?9 h* b! J(
- B3 l: b5 p) b+ h.clk (clk),
" b' T- B( a% H- G v( Y.rst (rst),: S' G D( Q3 d7 W
.wr_en (wr_en),2 Q, b2 S2 }8 E \( h7 c
.rd_en (rd_en),
6 R* ]+ s% Z1 X8 C3 T.din (inst_addr),9 v3 o( r' J* \& @- G5 S# }4 D7 j! b
.dout (stack_addr)
! i; t6 U: e5 B0 o8 B+ p# {);
1 C% p# J& f$ W# b. z9 O$ t( m3 F7 L! L# P7 q
% }8 n3 e% ~) @: t/ _) b8 }
; K! ?3 O, Z. c9 y. P% J0 Hregfile_mux regfile_mux
" v' u& K8 r; P, r(4 j' ?( `4 ~* t, w
.insel (insel),
. |0 a# r9 |( ]7 [* d. \4 _" ?.selk (selk),: W/ k2 L0 s% R0 s; O& p+ f
.shiftout (shiftout),
! l* r+ U5 {) T( T: U.kte (kte),
5 j& u/ T5 S$ ?! j.data_in (data_in),5 x0 r% ~ R* h; p# J p
& z- L8 A6 K; N! @.regmux (regmux)
3 |: z! [, y# l0 G8 m7 y);
N" u% r7 J$ r% ?* w- G 7 |. t7 @. E& X7 N2 M3 s! N
regfile regfile
% ?/ S9 u) ~& h( B8 B0 ?* ^(
2 @! k r# r* E1 I9 V" Q.datain (regmux),
* H4 y( X+ [) p$ d, I.clk (clk),; S+ ]9 v- z* ]3 L3 {3 r
.we (we),) x% ] M6 [8 A# p1 ]+ s
.wa (wa),. K( ]! C, M! `4 N5 ]5 E9 H! |
.raa (raa),! f! O! _. c. N7 d- b5 U
.rab (rab),
" s* G6 e. l6 [3 K1 V.porta (portA)," y' R6 K' K; A0 g/ T7 I4 ?% L3 v
.portb (portB)' p# R y- c* ~: z
);1 o& d- U- p4 W% k7 {) x" U8 v
( |% m: O+ p4 a( W 7 Y- H8 H3 P+ G& L* I' `
1 A7 M! I5 q+ k( j8 P$ I/ L% E
endmodule0 v- C) ?9 M+ y
. [+ b! K- ~5 @, ~6 N4 Y
3 V4 K' z3 a- B% `8>程序计算器:genpc
3 H. U# z' j6 o2 ?$ l; a
, N# O! H6 W5 V& p4 O7 U
8 X2 g' k: L9 E, I+ l8 `1 x* ^+ {( ^$ O
0 }. `% \7 @1 s, U/*
2 K9 X7 K/ ? O7 ?2 }# m& d* k*
5 K# ~- y5 y m# h" t7 q* file name : genpc.v
) X% ?1 v% R& A+ p* author : Rill8 j0 \/ F9 T' T+ ]; Y3 v
* date : 2013-08-11# n0 l5 a q6 H% _
*
) G, y9 N; X9 }8 ~* A7 ]*/9 I- g& M! K) @
% O* Y% J/ b! }6 W# }/ A`define boot_addr 0 //boot address after power on
; n/ a6 t( F2 j+ U; a0 @3 T 2 i/ } ]) n% n9 K1 N7 g4 {
module genpc9 X- |" O5 V7 v. e: E
(3 S: K. l1 c4 H2 Z+ \1 B: T
input clk,
4 q9 e2 i2 ]' m4 G/ Zinput rst,
& y; z7 D8 J7 l/ H5 t4 n1 u3 S / F9 {$ `# q9 l
input ldpc,
$ R( s) r: w4 C& d/ Qinput selpc,$ A5 i, [8 X" s" \3 G! v- r% l% f
input [10:0] ninst_addr,0 Z' I" \( p x, [3 R
% C7 `3 r6 Q$ ?8 ^
output [10:0] inst_addr* K1 D5 ^; `8 j8 b* N
);8 Y. M# c2 b5 X+ u6 u% B+ z
- U' d, a. L! g, Kreg [10:0] pc;$ u' ~5 W: D0 l- l( E7 C- h3 m/ }
# ~" J0 R: ?* x& w; Y- K
assign inst_addr=pc;2 D+ X) ^- p/ t0 s! f" @" b
( o( N1 S E1 }' C) F
always@(posedge clk or posedge rst)" I. u' _+ J$ _8 y f4 X7 Q: V
begin
! J( K" ~0 g2 c; f1 K7 E5 ` if (rst)$ ^* {- i: g' I# M) L8 h# y, F
pc <=`boot_addr;$ Q; S/ F5 j- b2 O% P
else4 j, i: k& k0 c8 _
if (ldpc)
5 d: X6 ^6 {4 P8 H7 P3 D; d if(selpc)8 o8 c" f9 l1 }6 v0 E9 D
pc<=ninst_addr;
4 r2 l1 O# g" ^: U9 p& G, S6 ~ else
( @" F; D7 @. ]. W- W pc<=pc+1;- D; J, l( k7 K7 ~$ [* {
end) F) Z& |+ N! [% ?4 A
* d: W2 V6 l5 G% W
; J, Y: J; a5 q- ^endmodule7 J5 J% h; R' ]( q0 f6 p
- x( k8 f2 q# _
/ L& F& L$ P) J2 S1 I& @
" Z* a: c, ?2 B$ v; a: v S; y& p8 g% F5 v y: ?
9>运算单元:alu ,alu_mux
9 Y4 h0 F& E+ o: |6 W+ b: q- O4 M3 F+ |; w
1 P' I* ?* z# g& I: t/*
4 g+ p) C! X* S9 G( Z" Y7 z*# U* o+ o5 F% U& B+ G
* file name : alu_mux.v
. e4 {0 l3 j! `7 c" J6 y* author : Rill5 h+ E6 L- ?2 Q
* date : 2013-08-11
7 o4 D) N; L; f4 V( B5 ~: l' E*+ x( M, b% o( i% _, v4 h
*/
; v L5 i; G0 A7 i
. P" q' s k |
' [1 t) E1 E+ Y0 S6 b
( W, D5 j5 C+ E& A2 `3 y- }module alu_mux, c+ r0 l) ]+ t4 L& b8 Z
(
- _/ h# c4 ]8 X" S0 Minput selimm,
9 d Q( I, q' P4 |" C' E& a: j) S+ Ninput [7:0] imm,$ s \2 ^" _. P2 ?$ I
input [7:0] portB,
4 g: E% _/ [1 A0 O1 o - k8 d0 B6 |& x. U! c
output [7:0] muximm
7 K+ i2 _6 ]' T+ W+ J6 ?);
7 e0 [. l2 V* i
* G6 s) I4 m% C- I# zassign muximm = selimm? imm : portB;//result : imm if ldi insn,portb if ldm insn/ L- Q# S6 H0 T8 N
. q: j. D# z- l9 _ , c/ m( N& q3 e; n4 c; U# Y
endmodule- Z' x( x: G. W. u/ j. w* r
, F' E$ U; H, ~, U7 s
7 d0 j) q/ d( m0 z# v5 S
/*
8 v) l5 g w" J) e' i9 f*
, R/ T/ o0 z5 d( y( L* file name : alu.v
3 o1 x0 F/ _, n( r0 W9 n: ]* author : Rill
; H, h# k1 t; }! Q D$ L* date : 2013-08-11
7 M/ ~2 G- b4 j9 S4 r. r*
4 P1 p* D7 X! W/ s*/( h: L$ m+ I2 z! t
- T# R) j& }& o" \6 N- t 9 O5 j, ]6 E- J: p+ A" m8 }
* ?$ i% p6 A2 ]4 q$ j
module alu8 s9 q! h9 O" ~+ Y1 M, i
(
% c6 y9 v; K0 G& m. Linput [7:0] a,
4 f W% d9 P! R( W1 G" |input [7:0] b,
. w# h! q0 Z! t2 H/ X* m4 u( p0 uinput [2:0] opalu,
8 V c6 Z( @8 Qinput ldflag,/ ^- b7 f' |5 N# ]1 b
output zero,1 b2 w& h; ?& }& f% ` G
output carry, x; c0 b) l* e# _3 k3 g j8 x
input [2:0] sh,) L! q) k$ ^# h: @* \
output reg [7:0] dshift1 F& m; C$ [" F# d! b z
);& ~! ^' u2 h9 b! l* O G* B& E
5 K5 m( U: x5 S( D
reg [7:0] resu;, k3 r4 c" T6 b) v; Z
* M- w' I8 X+ R/ b* h+ L% kassign zero=ldflag?(resu==0):1'b0;0 G6 [& H( b$ E8 N$ @$ p
3 S* Q5 b( t- }2 p! @, g6 e! H8 Hassign carry=ldflag?(a<b):1'b0;! T X: [5 {2 L7 j; @! k
- M4 r# b( a. f& ?2 @% m6 oalways@(*)
8 a6 I$ B" a t6 H' A) O _& V case (opalu)
- m2 e) _$ f1 q# q5 r" R 0: resu <= ~a;
* L% l# d. t5 x- Z 1: resu <= a & b;
. K: }" O# ~$ f6 B, l3 r 2: resu <= a ^ b;
/ I; P$ K( B( c8 ^7 k 3: resu <= a | b;+ T; k+ N! d0 O; m
4: resu <= a;" Z+ {4 n3 X. Q0 b- d! ~* ^
5: resu <= a + b;
" Z' a+ I* v# _ 6: resu <= a - b;. {- H6 L; p/ q4 ^% J* |8 O. i; Y& i
default: resu <= a + 1;! O+ }5 i/ K- N/ i% t; W
endcase
: I2 f1 r0 d$ R) j, N 7 n+ ?" e1 O: s1 |# o% |# \
2 y' H0 ?$ }/ i+ F
always@*
! ^$ Y: E0 m$ ^6 ` case (sh)3 W7 z* k% H# y% O* I
0: dshift <= {resu[6:0], 1'b0};* I: y( _3 W2 N' L8 h
1: dshift <= {resu[6:0], resu[7]};
: D" T$ `; N% @( ~2 y+ _- P 2: dshift <= {1'b0, resu[7:1]};
$ @" t9 X: j4 T, u, P' j6 p 3: dshift <= {resu[0], resu[7:1]};
- M1 z5 D7 ?1 @* G9 i 4: dshift <= resu;3 _7 e4 w, \5 p e; B0 n
5: dshift <= {resu[6:0], 1'b1};
! G. e, \/ ^$ R9 A3 [- V% ]* Z 6: dshift <= {1'b1, resu[7:1]};' R8 q' R1 r* l# n
default: dshift <= resu;3 o, N% }4 @: B7 m+ [
endcase4 z8 H9 C- X' K) x$ k
/ a! q% b, [: R" a/ l V2 m7 P! h
endmodule, P( L; O" }+ O# j% m
8 Y; o8 H+ R. m+ _: Q
" E: r6 e* u% d+ }3 q) ?
10>寄存器堆:regfile,regfile_mux' _$ ]% ]* v; z/ o
' Q% }' L- p' J7 I% x8 a( E5 B# I3 Q4 s8 v
) o$ t" k7 N: g- I7 b+ ?/*8 X3 H+ n4 k; M Y* c$ c
*
: S9 Y! o* \1 C& [+ }; H% \* file name : regfile_mux.v
/ F4 I/ z/ J J" G4 t& [4 ~9 D. C* H* author : Rill# e' s4 s+ ~4 K2 M! n
* date : 2013-08-112 u. q: g: {1 J4 i
*
/ G$ z; p( b- M; X% w*/5 E# t: h* t0 K _! r- W
+ } R: \( ]' L. d
8 i- @/ i7 B% Z2 y , A" E5 e3 y: ~, y" c( _' s2 R
module regfile_mux
. k' O7 n. K* [# C" G(; P6 n# m" p+ \. `1 I- O. ]( x$ x2 E
input insel,
7 }: t, `/ V+ V. m7 D' E2 Vinput selk,
8 S. `; G s( `+ ^1 G5 Binput [7:0] shiftout,
* `5 Y+ Q# B/ D! [input [7:0] kte,
! ^1 f" X/ H# p1 J5 Z8 einput [7:0] data_in,+ z: ` c$ O2 ?1 Q. l
8 C) z9 v7 r* {) X3 O
output [7:0] regmux: `: f. k% ?9 V) f
);* R% y) X7 S* K( f4 c# W
9 b# O, k7 I/ U* P$ y0 Cwire [7:0] muxkte;
6 r( U& q4 Z) G0 X2 H 8 h% }' ~# X& n) L: ~
assign regmux=insel? shiftout : muxkte;, G$ ^5 @2 ^: T$ _+ s: B
assign muxkte=selk? kte : data_in;2 q& g% P) H! y0 E" F
2 p" k W2 V$ y2 D+ s; Z% }
) X7 d; h; x8 K0 w- v4 rendmodule
8 J' H6 Y# W& K
' z2 T) P( A) T8 Y% k) H0 z3 e3 Y# s: n( D% M
/*
% I1 V* P! Y$ h: C*
- [1 Z- V9 ?( A4 ~* d3 J- Z4 s* file name : regfile.v
0 m L B( H5 S! t8 l& _5 M* author : Rill
" b: o2 h6 B% Z4 i$ k( @! p6 W" S* date : 2013-08-11
: r0 Y: u0 E3 ]3 }. B$ n" u*6 i. Z, J9 x- i( k$ s
*/
+ h& N" S3 L, K2 \3 _, s3 r
) a9 w, T4 c) ~) H' Y 9 ?" W9 b) H9 r; A, Q: C8 Q; J
" j9 X6 m/ l& E0 F5 M1 {; o
module regfile(* k# H8 I: D9 L" ^. l
input [7:0] datain,- f- R) _5 u2 X0 x5 W
input clk, we,
6 k# B f1 v0 X8 W! b1 Q input [2:0] wa,
( y8 _8 h3 ~" s7 b) w; [! X; v: R input [2:0] raa,
- p- O& `: L& b- D input [2:0] rab,& X. m+ J. M8 |/ J
output [7:0] porta,
- W7 k0 u6 u2 O5 @ output [7:0] portb
* t- @ Q. u3 p5 `" U );
8 F, J* U" I' L( m
% P& y! q7 l _0 p! D) K
+ c" E$ d$ t( X- ireg [7:0] mem [7:0];//r0 ~r255
/ f. X, _$ f% C+ { " p! N0 u% C- ? F6 G
always@(posedge clk)- f8 j0 y% E0 W! ~+ B$ T; H8 n
begin
+ P1 {: U/ N% T/ G: ] mem[0]<=0;//r0 always is 04 Z/ q! n! U L8 E( i4 k2 w' x! o, `
_! d& T. M% u' b" r
if(we)" Z! O) B" L- M* Z! L- G* u0 {8 |
mem[wa]<=datain;
' w. o6 t: J- zend + ^( l+ x( F, t. o w) X/ p, `& L* m
6 o9 i1 b! u2 D2 U* u
assign porta=mem[raa];, C. q/ D# y5 p6 e7 E0 c9 y p
assign portb=mem[rab];
( K5 P# ^4 z8 e% q / ^; @. I" h) {! Y3 B
1 @, K( R4 E- t5 eendmodule
! B; u' f% D) ?; j- h; n
2 b; x" j* G( T0 Z4 n0 F- t7 g% S$ R2 u3 Z# |8 e1 R- ~* ?
11>栈:stack
& z+ J9 O- j$ E1 }0 I- w
* p/ n+ I* p$ ~) _8 f6 ]: |% \! X! ]! p+ v! U4 f: ?
' d% ^6 x! y3 C V0 v/ s
/*4 U) D1 Q G6 ?% ^* d
*+ ^/ ]7 F! q7 g: E* b0 R8 y! L
* file name : stack.v
3 R7 @" N, v; x+ s* author : Rill
: K) X% C! |4 S' ?* date : 2013-08-11
! w4 Z- [9 s( z: x+ }' J3 t*5 k3 H2 k y! |0 a& \
*/
0 I7 f& m4 ?5 o/ u % R3 B4 N: D" b
3 I* I# V) Y4 |% `
; r E! j! D g- e4 nmodule stack(
* q# P( b q/ ^$ n( ]# P input clk,
# H) H# F. v# z% @) k4 G( r input rst,3 B0 B" R3 C0 l2 ~) D3 w
input wr_en,! @' ~" H9 e; r/ ]2 ~" D1 s _2 ~# \
input rd_en,
/ @& W0 _* w; K8 F input [10:0] din,
6 o5 J/ \! m$ H w# z4 H; m output [10:0] dout) r* O. A. F. \
);
" o0 _# }# J8 f1 q- z * U1 A* x. Z: r: ~2 D( {7 @- B
( Y/ g6 Y$ y# Q0 t- x; e
(* RAM_STYLE="DISTRIBUTED" *)2 q6 t3 L- v* l. b& |
reg [3:0] addr;
7 T' P5 H0 v) e; g0 mreg [10:0] ram [15:0];9 [" n) |& D% y# L. T8 s5 h$ t
( h$ }( d* o2 X
assign dout = ram[addr] +1;, i) w8 L9 r& M+ [; p1 g. Z) f) L
: t2 |9 ^% `( S5 B
always@(posedge clk)& i) N# Q8 J$ G; i) A( X; g
begin* [, Y$ z5 Y4 T- M$ i0 x& d, _
if (rst)
( f x+ t* J% h7 ^/ _. P addr<=0;
, z4 u& b H1 W; L! z" W else
3 d8 x1 V, K1 A6 ` begin " M: y: T3 }1 I! E. ^
if (wr_en==0 && rd_en==1) //leer
" d# U3 ~2 m" q$ s& _ if (addr>0)
1 V I6 ? n; H, j addr<=addr-1;
2 C4 `, [3 ?0 L( @0 X: H$ Y if (wr_en==1 && rd_en==0) //guardar
+ h; e: O& j; V6 f- m1 y( f if (addr<15); [9 x! `4 t3 q8 ^1 z% @/ |6 p
addr<=addr+1;
7 \# G" k- U% t8 T end
' X6 j9 U0 @& K0 b; ?2 `4 }; Send6 y3 m0 |: C, x# ?6 P5 Z
1 m8 c' {& H. F: Salways @(posedge clk)
, K4 V8 `% E; [1 |- _+ mbegin
: K2 c; w# y: T$ I5 c; p9 C if (wr_en)+ d& ?6 z8 M# N* L
ram[addr] <= din;
" K- X9 u% H7 m! Hend) s E. Y0 \8 X5 g/ y5 E2 O! e* Q# ?
5 |5 s! _$ a8 \4 K% Z4 L9 j, d- vendmodule: ]# u, h# s7 X! b3 I; b
! o$ A1 [3 X$ k: B$ F
4 K: }: h- T* \3 C3 r+ \: o- \
5,modelsim仿真
) i3 E" v7 F4 V. R; v% }1>编写testbench
6 \9 D6 s- ^( F3 `% | l* `: a要进行仿真,需要编写对应的testbench,由于咱们这个cpu很简单,所以测试激励也很简单,代码如下:
- W0 B# B' z8 O
- y, Z2 q4 \: w& _, x6 b7 v/ p# R0 A
% \0 ^/ D0 J) @' ^/ t/*& a& p1 w5 @3 X2 J( v
*
( O! b3 B- U' m/ l' m5 i* a* file name : tiny_soc_tb.v
$ X# ]2 Q. B J1 @0 z( \" ~- i* atthor : Rill; d2 t( V" i7 a8 D k
* date : 2013-08-11
$ Z' P* x# [) |1 l*6 D) V, H$ D4 w! L& t. Q
*/
- x8 V- B; T9 x8 r6 G. w 2 g1 v R. L3 o0 U! Z/ S9 u$ w
`timescale 1ns / 1ps2 E; Z- Z$ z; G$ w9 J
# ^' _ H0 Q: ~1 o: Z" Y; fmodule tiny_soc_tb;& k9 m+ m7 N3 T4 ]. T
- Z C1 }( Q2 ^* ^ f' d: G# Q ) D9 K {" b6 t" g, D1 o
reg clk;* t, K; C/ p' a1 q3 U" C% i v& v: @
reg rst;" a; v2 N2 X; a! b# a4 u
- `: F& l- q& h/ j& \( [6 d " T% T5 B1 S) G- @% K& e5 w2 C0 o& O+ c0 p
always #5 clk = ~clk;
" W. s3 b$ E" J; } - H4 J! h1 y- q4 w
initial
3 D+ u% m# h: J/ Qbegin
( a. y7 x2 i6 f. A3 p) u' e. n$ A #0 ( B7 {* G; `# @2 @3 _3 N8 ?
clk = 0;4 W: U2 k. H# T& i- @- g Z
rst = 0;0 \+ y5 j/ T! p0 K
#15 2 x2 t# o" D9 l- t. `) ^9 Y
rst = 1;( l2 e' X- {% @2 @, f) S
#10 0 M" K3 J7 }$ v
rst = 0;
! a) _$ P" X8 G" J6 p _ 9 G/ J6 e4 H( x' L% p
#1000
7 C0 u b# N, W/ o4 s9 Y( \ $stop;6 k( U. Y8 u3 k/ L: C
end6 n, k# G( ^- j# l' O: D
k; T5 C) y S/ d
soc_top soc_top7 h- P: B; S$ @, S
(& x$ G S5 I' Q& V
.clk (clk),/ s0 x& P6 r0 F
.rst (rst)
r' a& l/ X3 ^) q);" G4 J" ?5 B% l' Q$ W
: |: q" h. D# Q2 u5 J( O5 x% L7 t
% m: W! Y' A' ^. R
endmodule& N [* U) R" S9 Y6 }1 l+ B
2 u6 j0 `: k( Q6 A
* q. @1 m' z2 q9 m( g" B, F2>编写汇编代码及手动汇编' k. d& _6 Y3 P3 M; ?6 P
当然还要编写其汇编代码,如下:- _# T& ^% s8 ] A& a
# f& ]6 ]+ k5 p" n, D, ^! ]0 Q
7 ]! O8 T6 p2 ^ `9 e5 S; s" R9 P0 y4 z
) ~1 ~8 L) S8 x5 m: W: }
然后我们要手动汇编成机器码,指令集都是自己定义的,所以是没有现成的compiler,只能手动汇编了,还好手动汇编要比手动反汇编轻松多了(之前,我们手动反汇编过OpenRISC的启动代码)。
_2 b0 D1 |/ k V% F7 h2 |7 k9 ?8 z- U
汇编完成后,我们将机器码放到指令存储器里,如下,共七条指令。
+ r% U- x& K* y8 z* I! T6 ^" J/ G/ X+ d! V" }- c1 v2 E
^ r' n( c; g$ A; R# Y: b" m2 Q# W$ B
$ u T$ c/ O. ?' h( k# h
# S' k- ~/ P) z2 ^3 S
7 V5 ~3 h0 M y3 X, M1 D# j$ c$ j8 \" u, ]0 I# }
3>仿真结果
( _# p3 B+ H6 }7 l完成上面的工作之后,我们就可以用仿真工具进行仿真了,下面是我用modelsim仿真的结果。
8 W6 M5 Z' z: R* M+ w" W/ X9 o' J6 A1 D
从波形可以清晰的看出七条指令的执行过程。在运算完成后拉高write_e信号并将1+2的运算结果3写到了ram地址是55(0x37)的地方。
( \8 [# J1 g/ k5 h( {
( T( x. [7 @+ i4 o. L
6 `# y( n) p; G9 p. r% ]0 m+ [6 u7 z- Y6 {: w6 L* @0 |" O
: v" q7 n* z8 |& I/ [7 q
! _, H5 r: O- q4 k7 T
' L* m9 j% N( l0 ?% j5 H3 e$ u& |; u7 e4>代码仿真覆盖率) W3 A3 ?$ Y) `4 ^
由于这个测试汇编代码很短,我们有必要了解一下这个仿真激励运行过程中到底测试了多少代码,下面是code coverage报告截图。& G( _+ I/ `6 |! C8 U7 W9 e
) C/ M3 i: V; n7 B7 q
7 Q# [! K8 r! K0 Z需要说明的是上面的截图并不完整,下面是完整的代码覆盖率报告。
% U4 O9 E) f s8 P( |
r3 u+ P, @0 \( x* `1 \$ o+ H" j5 T4 h+ r# c2 ~
( F) Q+ v6 U0 O8 l$ \9 `+ c9 E
Coverage Report Summary Data by file$ C( j, u' j# U% u! i! d& o
$ E! @' ~+ g1 D( E/ n
File: E:/work/tiny_soc/bench/tiny_soc_tb.v
. y! t& \+ m0 q. R5 u! A Enabled Coverage Active Hits % Covered
. V, ?$ T' H& M3 O# L( o+ p% t4 V ---------------- ------ ---- ---------& T( r. b8 d1 L& s$ x
Stmts 11 11 100.0
, d# t( @/ T t8 y5 R& B Branches 0 0 100.0" [1 j0 e: Y% F5 I
Conditions 0 0 100.0
. L. F% N `2 v Fec Conditions 0 0 100.0
7 R+ r- I, V- i! E5 n% M0 u Expressions 0 0 100.0
" v+ f, b! n% \& I/ U9 U l Fec Expressions 0 0 100.0
* [$ o! A! c' a3 `4 K5 { * x' d' }( `% L8 \" C! Z$ J- G
File: E:/work/tiny_soc/rtl/core/alu.v
8 N) T9 u0 T1 Q Enabled Coverage Active Hits % Covered
3 C* ~# [( _8 @ ---------------- ------ ---- ---------
9 R9 Q/ \; K' p7 B& v! [ Stmts 20 7 35.03 [8 E5 l& U$ S. a
Branches 16 3 18.7
; G' U# k2 r. R) ~9 M9 w3 O Conditions 0 0 100.08 U. v6 J* k# P. W" I) R
Fec Conditions 0 0 100.0+ m" X6 H( B8 f5 {1 X9 m( m
Expressions 8 2 25.0
" k3 \* D+ Y. B. T `) o% Q$ a Fec Expressions 8 2 25.08 i' G0 j, |8 h$ k5 f. ~0 Y
3 _. _# M- U3 j+ V" L
File: E:/work/tiny_soc/rtl/core/alu_mux.v5 j7 ^- w1 i0 }9 B! F
Enabled Coverage Active Hits % Covered( Z2 Y' O$ G z1 N3 J( D" q3 u
---------------- ------ ---- ---------( m. x6 z. W, R+ [3 y
Stmts 1 1 100.0
5 R+ ~# q9 Q% C; u: N Branches 2 1 50.0
7 ?1 H7 e5 n$ O7 F Conditions 0 0 100.0! f# {" Q5 B: u S( _/ H8 b
Fec Conditions 0 0 100.0
# W0 _' Z# Q) c1 U+ s Expressions 0 0 100.0
* J, z$ p6 m$ ] Fec Expressions 0 0 100.0
+ X1 O3 T. a0 X0 c7 _' w1 R @
& c# `* O. s- h% O" X( }2 \File: E:/work/tiny_soc/rtl/core/control_path.v1 { B5 c& j5 d0 n
Enabled Coverage Active Hits % Covered
y5 Z7 D1 E0 [4 u' t ---------------- ------ ---- ---------% S% s% k {# e
Stmts 160 48 30.0; c. ^, h# ?/ S/ G
Branches 60 18 30.0
0 V* h" m5 K9 J' B. E8 ~$ a Conditions 3 1 33.3
2 x$ D( A8 O% B) q; b& h' H5 F; E8 v Fec Conditions 4 2 50.0
9 P$ B5 l8 e$ J. G5 O4 L/ ^ Expressions 0 0 100.07 ^( T4 O$ g, J! R6 n1 J$ M
Fec Expressions 0 0 100.0
! E' ^/ x9 M- H9 p" F8 n 3 Z: H2 M& t6 ^; m, M1 m4 D% {
File: E:/work/tiny_soc/rtl/core/genpc.v8 q( T( N) K6 r8 V0 t" V
Enabled Coverage Active Hits % Covered
8 S$ |& V3 L; i; B: _ ---------------- ------ ---- ---------
+ D& T1 P0 J$ \# ]3 f Stmts 4 4 100.0
- }5 R+ b& `" C0 Y3 t; c P6 c$ l Branches 6 6 100.0
% |- ~- v/ B) |2 H$ r$ Z: V I9 d! f Conditions 0 0 100.0 C, Y& V n+ r- F
Fec Conditions 0 0 100.0
+ ]9 _; L# {6 \3 ?) Q Expressions 0 0 100.01 {2 D0 ]! h1 s- [
Fec Expressions 0 0 100.0& z" l2 y3 L" c6 W: P K$ b
2 R/ {$ S* N. g
File: E:/work/tiny_soc/rtl/core/regfile.v
9 {, x; E9 _7 d" z H' V Enabled Coverage Active Hits % Covered) K4 f6 h6 n7 c
---------------- ------ ---- ---------
# j, w; V: X7 j, Z- q9 _( O Stmts 4 4 100.0
. M' H5 h2 n* S* E Branches 2 2 100.0 N% T4 O2 t# D* q! G5 }
Conditions 0 0 100.0
4 F7 p9 S: S& ^3 O+ f; m Fec Conditions 0 0 100.0, }* s/ w7 H! f9 k4 `; Z
Expressions 0 0 100.0; E) Z$ u# ^ R1 _* h- i- N
Fec Expressions 0 0 100.0& _9 j& ^6 K( ?6 U r! ]& H+ u
4 x% c; N& B1 a% Z. wFile: E:/work/tiny_soc/rtl/core/regfile_mux.v8 Y; `, o ^2 X0 ^# E
Enabled Coverage Active Hits % Covered
" T, \: N: h9 o1 \9 D% A) a ---------------- ------ ---- ---------
: \+ s9 O/ X" c Stmts 1 1 100.0
- l8 K. |6 W9 T& d% O' h; _ Branches 4 4 100.0
% t3 @4 t, h0 R Conditions 0 0 100.0
, D! h5 T1 z$ L7 Z8 c6 g" ?) N( ? Fec Conditions 0 0 100.0
! X* A/ @+ a- B: G Expressions 0 0 100.0
6 I& ?% H: w! `) J Fec Expressions 0 0 100.0
3 u0 q# R3 q6 M: b3 R; t7 H
7 x/ A5 A n8 L e1 m |File: E:/work/tiny_soc/rtl/core/stack.v: O( c# S9 o5 j# h, S) c- D) F( F
Enabled Coverage Active Hits % Covered3 @& J% I% G: p. M# n. B; N
---------------- ------ ---- ---------
x& i+ r) h/ D! f- w/ e Stmts 7 4 57.1! W, A0 o/ m o3 i5 `; Q
Branches 12 5 41.6
; ]; y( t) C+ W! \! ] Conditions 6 2 33.34 D( h: v$ e, b2 \! `9 R! T
Fec Conditions 8 2 25.0
. }8 {6 Q/ _, O* X% a$ Q* L Expressions 0 0 100.0( M& H! b- K$ o6 x$ f
Fec Expressions 0 0 100.0
1 C1 X# E9 }" @- f$ y # d2 x# H( u0 D* Y7 i: N/ s
File: E:/work/tiny_soc/rtl/insn_rom.v
6 O! ^5 _4 ?, ]7 D0 K% I F$ \ Enabled Coverage Active Hits % Covered
8 U1 ~* L! ~8 }7 D" C ---------------- ------ ---- ---------
3 {: G4 C( K' B! _ Stmts 9 9 100.0; @# u2 |5 o0 ]6 x
Branches 2 2 100.0( ~# j% b1 L7 Q c5 B1 t
Conditions 0 0 100.0/ [# H2 R. k, |. k* a
Fec Conditions 0 0 100.0% _) }% H& o @
Expressions 0 0 100.0
. w0 z$ r/ M! ~7 _ Fec Expressions 0 0 100.01 @3 k0 B* @- s& L) W$ {6 F5 j% ^
L+ ?) K( m, z1 I7 {7 V9 _File: E:/work/tiny_soc/rtl/ram.v
% ^, a" Y7 n8 d# J+ I& p Enabled Coverage Active Hits % Covered; C' ` M7 x( ~0 P. o& {6 \6 s
---------------- ------ ---- ---------
/ w0 L+ y8 I8 \- Y! B+ Z Stmts 9 8 88.86 X' [' i8 e' J& J. |+ \
Branches 6 5 83.3' D8 I# Y5 z/ i/ w9 W
Conditions 0 0 100.0
4 h! r+ B2 R# X/ m Fec Conditions 0 0 100.0) B$ ]& Z3 [+ a
Expressions 0 0 100.0
/ Z. |1 B- T1 Y& N Fec Expressions 0 0 100.0
, L" F; Y6 K( c; F0 z
9 s7 P" G- y2 `5 L" n1 Z* b9 t W4 w# C, e6 W" x: |3 E- X. \) @
+ J1 {9 q8 U2 }( q- Y3 i$ g( o* L' } e* }0 n G
. J+ S. H! I: s" j0 m7 \
7 C* ~% |" o9 f3 l6,综合
4 R: { b# e+ R" ]0 o4 n完成了仿真之后,我们就可以综合一下,在FPGA上验证了,下面是我用quartusII 12.0综合的结果。
E+ R/ o/ ~) ]. c8 r
7 v. Z1 K" v& ^1 c- K3 {& X) M# Z9 w, ^
2 v: s" X, {- w& K# V, a) H7 @2 j
soc_top模块:; X( Y( O' Q+ k* i
$ M# Q( w0 o0 m+ T6 t2 h4 |' O/ s# U: o6 h+ V# e4 z
5 h) Y* z! q$ ~# {7 q: L# s6 _7 `7 Q* L. o4 \, A
core模块:* q+ F# ~+ O3 l, _5 F3 e; g
7 j7 }! ?5 q$ h- Y
% c9 Y* [" L$ d1 K# x
- X2 Y2 i- H0 M1 L5 ?( S; _" \ Q
: Z# ~* ?& d- G, b( Hdata_path模块:* Z+ ^& ?% d; _" c# t/ C! _
3 P6 m& O) C8 l- L& T
, G: q) l6 |4 q2 i `/ e
3 X' ?& G* N) j
8 p) j5 U. l3 }& v. N
! F& Y+ W" l+ {& E# A( [( E) m j+ g: L9 _; B# \
7,改进及优化
5 ]+ _: n& L# D" S* W4 R咱们设计现在这个小cpu core的目的是为了学习,在于了解cpu内部的运行机制,与软件的交互过程,没有考虑性能,功耗,面积等问题。7 h8 r' e) _9 w1 `2 W4 z% f
% g4 O4 @" x2 t( C( f8 v
下面,我给出了采用五级流水的数据通路的模块划分和接口定义,如下所示,感兴趣的兄弟可以试着实现她。
7 m: v$ h! X2 P% z) A! n
* d& c7 s# v9 ^% q- k. l% |4 o( \+ z9 [+ j9 E/ I9 T. T
& a+ ~( \" ?2 W7 u
6 {* h1 M1 s# _- g/ b% F" p0 m! `/ t5 D$ F( @5 O4 f4 K9 j
- Q0 h' l% z6 _9 P' l
8,future work) U4 @2 ]% J8 i. p
1,pipeline,将core流水化
S4 B8 R! v, \' D$ Y3 w6 J. A" t4 p3 Q) F9 r' A' s
2,增加乘法,除法指令。咱们前面介绍过4-bit乘法器和除法器的设计:http://blog.csdn.net/rill_zhen/article/details/9700155" i9 W- {5 J$ v' `1 R) V
) E" I$ I' B0 x6 U$ j
3,fix bug) k7 X' w9 U9 R! [$ ?
+ p& ~$ K; v6 P: K# k" C* G& u4,设计tiny_core的assembler,这样就不用手动汇编了。/ @0 P$ [! ]6 B) ^7 V
@4 f1 N5 x; ^) s: U; O ~2 K
9,小结
: L; }* w! g; M' W本小节,我们试着设计了一个简单的cpu,并编写了可综合的外部基本模块和不可综合的测试激励模块,然后用quartusII进行了综合,最后还给出了优化后的数据通路结构。/ n$ I% q; B( g* n, Z `1 `& b
" l/ U; i5 a# F3 G: \% h9 T我想,通过本小节的内容,应该对cpu的工作机制和软件与硬件的关系有了更深入的感觉了。
4 k- N7 Z+ c; y5 {- a$ K" G0 T% O. E9 l! l
需要说明的是,我的水平有限,再加上时间很短(两周),所以这里面肯定还有很多问题,和需要改进的地方,如果感兴趣,可以把代码down下来,先用modelsim仿真一下,然后再写个I/O controller,比如uart的控制器,挂到数据总线上,如果PC机能收到tiny_soc发出的“hello world”,那是多么令人激动的一件事情啊。" @% \$ v% V; \3 I& t
8 L0 D5 X a# a. \. Z/ q: o! I1 Q" Y
9 ~4 c6 C. L1 J: ?7 i/ r, E0 Z/ U' V7 a. d: b. D# V
附录:tiny_core的指令集
! o' M, [ O5 u: g0 L说明:; H z. }. `! B1 G
5 f* Y! S: D$ Y: G. }! o9 trrr:代表寄存器。
/ P1 t3 Z4 B8 v4 A8 [# T7 a: y( ?
+ v. n& _. k0 K9 H: D( yaaa和bbb分别代表寄存器A和寄存器B,其中寄存器A是目的寄存器。1 z1 u: S" B" e" w
/ f1 B% w1 ^( u; }( |; q
iiiiiiii:代表8-bit的立即数。' t; o1 F% J; x; h8 x9 q( i
' I) o8 o3 Z" d8 ^+ v, B* b9 Z
xxx:代表忽略。5 C, I9 s+ j: G0 l, ]6 r; Z, U
* ?: `' S1 y+ _# [+ W( ]ttt:11 bit的跳转/分支地址。$ V" j- U. F$ H$ {$ y
9 t* }2 S: n; e
9 N9 t# N: m" L4 b8 a) }) ^( V3 K9 z I: C( _8 v
此外,这个指令集其实很早就开始弄了,最早是去年上半年开始的,现在是最新版本。" @5 G8 q9 z1 ?6 s5 k# _+ K1 b
- G" |$ u% \- Z0 m0 @
# b9 s( p$ b: y9 ]$ S0 U
6 d6 M/ c0 L' q' k, Z/ h" K
2 F7 C/ r; Q& Y7 u* p1 g: c. v. {$ I" H
- S& Y! D" n+ t
2 G Z9 n! V) i7 U# d1 D, ]
% Y% H& u, @7 u& K9 k0 Q |
|