找回密码
 注册
关于网站域名变更的通知
查看: 399|回复: 1
打印 上一主题 下一主题

一个简单cpu的设计,实现,仿真与综合

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-5-15 13:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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: U
2 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

该用户从未签到

2#
发表于 2020-5-15 14:50 | 只看该作者
简单cpu的设计,实现,仿真与综合
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 23:05 , Processed in 0.359375 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表