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