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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
引言
! i- c, I* y3 w4 \* Y1 v经过对OpenRISC近一年的分析与研究,在此过程中我们了解了计算机体系结构设计相关的主要概念,重要的技术,和基本思想。我觉的,现在我们有必要练练手了。
  R( R. W0 g  [8 u4 n9 @
; ?& d1 ^8 O0 ~+ B7 Y本小节,我们将设计一个简单的cpu,包括ISA的设计,模块的划分,RTL实现,编写asm汇编程序,用modelsim进行仿真,以及用quartusII的综合。$ j8 j& d: l' L( _4 g

7 {. {. e* D5 C1 S9 r+ _% C' ?" G$ G* e5 X" N
' ?' f5 J6 ^- m8 z! I7 l' w% X0 J* C
1,计算器与计算机' o+ V/ G& m+ }& z% Y0 z! M4 n
我认为,在EDVAC计算机之前的计算机,都可认为是计算器。5 I7 X; ]) e; W; r2 A

9 s* y) s+ d. i9 ]# ]8 p$ B, C原因是,冯诺依曼对EDVAC分析时提出了二进制运算和加入存储部件,而在这之前的计算机是没有存储功能的,比如我们要计算(1+2)&(3+4),如果是采用计算器,其运算步骤如下:' J6 Z# u: t$ Y( h1 m% f

- Y2 t5 v, F: X3 ga,先用计算器算出1+2的结果3,然后人脑自己记住这个数。3 ]$ q8 D4 y" ]$ _
; p) y9 B; ]8 s% k4 F8 m1 L
b,再用计算器计算出3+4的结果7,人脑也自己记住这个数。
4 k. ~8 t" M0 Z* d2 i: Z' Z! e5 }
c,最后用计算器算出3&7的结果3。* y& e6 ^. C- l- z3 W& W
9 ?7 e: [) q% O5 s

& n( V+ m: l9 g9 S! ^
9 @1 ^6 T8 }" W如果采用计算机,其运算过程如下:
/ Q3 c# H( X. F) {5 W4 d- J6 Q) w; T# S* B
首先我们需要写一段程序,假设程序放在程序存储器的地址0x0处,数据1,2,3,4分别放在数据存储器的55,56,57,58四个地址。
& ?4 _% w* R) u
  O: q. e8 n4 O1 o程序的执行过程如下:
1 P4 L& Y' K! |3 c! A; T" L, l- o( Q2 h
( w+ B" }% k, A) l2 Va,将data_mem的0x55处的数据放到r1。
+ t& N1 s+ w" X7 {. Q+ C- q8 I6 u1 G0 B/ ~4 f$ V
b,将data_mem的0x56处的数据放到r2。+ T9 S2 t- v1 h) o* J  l" q5 x
& i8 \; Z6 A% {1 K8 D
c,执行add r2,r1,结果放在r2里面。2 l% z' l7 c, Y; J# J) ?

# c& N5 t: h  `1 I1 Id,将r2的内容写入到data_mem的0x60这个地址。' ]0 O2 n+ Y) l, `1 x. u* ^& g
% K! Q  l- f- H' N$ ]/ [) T' s- M8 ^

  z. C. V$ G0 T! S9 o# R% y$ S. ]0 H- _( F. r4 A, R
e,将data_mem的0x57处的数据放到r3。
# M2 k& @: \0 W# t  n6 }: g9 i, o8 |9 b( [" m$ q
f,将data_mem的0x58处的数据放到r4。
, A3 S. N  l5 s( j  u/ V, J
5 p* A4 V) g9 J5 J# j5 rg,执行add r4,r3,结果放在r4里面。
# l# T( H+ }5 V2 v
- j8 J% ~0 y" f/ h& Sh,将r4的内容写入到data_mem的0x61这个地址。
5 P8 b% h# x: d% Q. V' v) {% J; q7 u6 A' d, G2 M
* R  {% K$ j; T
8 o$ |# x# _3 H. h0 C" E3 q
i,将data_mem的0x60处的数据放到r5。1 V: {' D( ?- Q! V, e; h& a

8 F. C0 a- X0 P( n9 n( M. N% @j,将data_mem的0x61处的数据放到r6。! X0 F2 P$ D' s

1 J4 H3 ^9 k" U8 Ek,执行and r6,r5,结果放在r6里面。* J9 u, ?! N+ S1 u$ ^! M
; D, T' a! z! L( r; ?. ^% v0 c
l,将r6的内容写入到data_mem的0x62这个地址,最终得到计算结果。% m8 s7 F& C$ I6 ~8 j* n/ [
' G- [% w2 m; x: u4 o( ?! d

* ^* Y6 |7 y! k! X+ ^+ |我们可以看出,如果用计算器计算,只需三步就可以完成,但是如果用计算机的话需要12步才能完成。那是不是用计算机的效率低呢?今天计算机的蓬勃发展使答案不言而喻。
( Y( o4 e. \4 r. Z4 C- f* K
2 u3 ^2 K: }4 p8 O8 F原因就是只要实现写好程序,用计算机的整个计算过程不用人为干预。& v/ T; w) H. J8 x7 j
5 g# w) p! B0 a6 A, T
我想这正是计算机发展的根本原因之所在,就是计算机的出现是对人的很大解放。我们只要按照一定的方式写好程序,然后交给计算机,计算机会自动完成任务,而我们的手就可以干些其他的事情了!2 V& G) X4 ^, C- U- x
, n3 E! y+ e3 g  U

& h- R8 S8 o; e& v9 P
& s  y4 y7 U/ }% u2,架构设计9 \3 c+ @1 f$ Z+ k; V6 ^+ h; m
1>整体设计5 L2 c4 G0 ^: {# D& u, g$ }, O5 I# q
通过上面的例子,我们可以体会到计算机的好处,下面我们就动手设计一个cpu,来完成1+2的计算。
8 q: L% _  O3 X" D; `
+ j; r/ a  b* ]$ `  M' k关于计算机体系结构,我们之前说过的内容已经够多了。这里只说明以下几点:
6 ^: K4 n" g# N0 ?" f5 t
- c( ?9 S5 V; M0 _1 `7 {a,我们采用harvard结构,即,指令和数据的总线是独立的。0 D2 ~( q9 A% c' {
( B) {* `& J/ @/ e% E
b,流水线,我们暂时不采用流水设计,但是在最后,我给出了五级流水时的数据通路设计框架。
# s1 Y% D" u( O9 ^  w9 T; \" Y8 Q8 I; _
c,关于指令集,由于是学习目的,我们只实现基本的访存指令,运算指令和分支指令。运算不支持乘除和浮点。关于具体的指令细节,请参考附录。每条指令为16-bit。; t( C/ A% _" M- X- F. I  G# A
& f" m) g/ I& `6 b% e4 ~
d,为了对我们设计的cpu进行仿真和验证,我们需要设计一个简单的soc才行,这个soc只包含指令存储器,cpu内核,数据存储器。9 Z: z# r! V, z
- e3 z' d6 A1 x1 b( b
e,core内总线为8-bit。这就有一个问题,core外是8-bit,但是分支指令的目的地址为11-bit,所以如果超过8-bit,就会有问题,暂时还没解决。
7 l) h& ]$ c% ^' B0 M. G% T% t  G- H3 R+ i- T: t- k) f) l7 o
下面是soc的整体架构图:我们给他取个名字吧,就叫 tiny_soc,小cpu就简单的称她为tiny_core。3 R* p2 Q" |3 K% Q  p) m2 M

/ C& s7 s) Z: \8 C! N1 q# D
+ f1 D2 y* i7 {4 b
: }. N- f- g# g6 r" Q+ V1 N
( G0 e7 Y3 W5 e
2>模块划分+ F* _8 P; S3 W3 d. V
cpu core的结构如下:* ^$ S$ B8 B4 s1 v
/ r7 V) W) U( y
整个cpu core由数据通路和控制通路和调试单元组成。% e, C! l4 x, c) G0 W. ?! ~
  |3 ]. }3 s6 e' v+ v+ I
其中数据通路包括:; P4 K) R, a% q4 i) W0 U
2 L" G- c+ C+ W+ ^! g& F- m
PC的产生模块:genpc+ I7 w# U6 i. b# L

; m" N+ c# l  A& B$ s# x/ }& r运算模块:alu,在alu的前面是对操作数多选一的一个mux。$ m, g5 c' t  }

# D( {3 M& r& S. I  T+ h: Z; e寄存器堆:regfile模块
5 P. S: h  `, P9 O: h/ f5 i; m
; t; `7 x' @# b% `- d; B还有栈:stack。
9 w) d  @5 W; a
* M2 e7 w* @* c+ B' W  _8 I* k
, d* e. L$ ~# u/ H  B# F
* u  t& W# l. G数据通路受控制通路模块ctrl_path模块的控制,控制通路负责指令的解码,并产生对应的控制信号。$ U0 O9 u9 z9 h% ^9 N
3 q# b$ a, E1 ~- P3 y7 [( G" l% ^

/ z0 f3 x+ }, @( Y$ h) Z) n; ^+ S6 N  I6 i, R% v
调试单元,由于只是学习目的,调试单元最简化,只输出当前的PC值和当前的指令内容两个信息。
  K# x6 B$ \$ l* P& `" \/ a# Q! Q8 h7 q& S/ Q9 F

; B" D& A0 P& N9 p- p
% s+ O: L+ T* V4 @6 d1 N: H
8 p  _" y! [! ?2 ^1 p3 n
' p5 o' k- a6 j/ M
1 |$ V% z* U+ d0 Z

# d2 H- S7 A: g/ q! u  ]
7 _5 r( o7 ~1 q9 _5 N3 O3,模块划分与接口定义
8 |$ I( V; q# }* V/ Z* r整体的架构设计完成后,我们就需要进一步的细化了,这时,需要定义具体的模块名称,模块功能,一旦功能确定之后我们就可以确定具体的模块接口信号了。
/ B/ ?7 C2 V7 M1 W' V1 i9 w& X0 ~, @+ r  @
如果模块功能过大,我们需要拆分成更小的模块,这就是top-down的设计方法。关于设计方法学(top-down,bottom-up),很多资料里都有介绍,这里就不再赘述了。
6 y# e# e' |% T. S7 D1 Q' A: i6 I
1 O: M3 h9 h  K+ S; y5 {一个完整的工程,和做理论研究不同,需要处理很多实现细节,下面,我们介绍一下,其中比较重要的部分:5 y8 _% L9 a( g3 f4 e
1 R; q: P. J: z: c  F  R+ V. G  ^; U
1>genpc模块) s( U: L( h8 e8 ]9 e5 ^1 j
这里面需要考虑三点:上电复位PC默认值为多少?正常指令执行时PC如何变化?遇到分支指令时PC如何变化?
( A! q' I2 x: d. @; s; P+ m* J
关于上电默认值,我们可以通过一个define语句来设定,允许用户后期修改方便。/ ?- k0 M) s( B3 z" o
( d! q' ]. h$ u9 W
关于正常指令的指令,PC是加1还是加2还是加4,这要看指令存储器的访问方式,我们的指令存储器是每个地址放一条指令,每条指令是2个字节(16-bit),所以我们只要PC加1就可以了。6 W, H# b# c. s! T  _# K/ k. E

, s7 m$ y( `! q/ T' ~  Y关于遇到分支指令,我们直接将控制通路经过解码的跳转地址赋给PC即可。
6 I" h5 u; p$ E- T. _6 ~
7 o+ q' ~/ g$ t, }genpc模块的C语言伪代码如下:5 t6 V% L/ G& ^) D% Y" D

# p5 Q$ D' ?$ [+ m# J  w  s
3 V( Z4 e+ D2 [. k" D2 ^6 d( n1 D7 _3 D7 Y  z1 g0 O) h) K
genpc module pseudo code+ a4 V" F5 x( N( {( @
2 ]5 u) [" M' e6 P9 T% A+ u4 I+ a
if(rst); S( F% `( o# g
{
# G- p+ O+ }# h- c0 g        pc= boot_addr;  q: Z! I6 ?* x
}0 C: D% `3 m* l% u
else
  j( [# X8 y, y{
, U& J% N2 u3 q7 _4 c& R: O        if(branch)
1 L4 S5 J- l/ L0 R% Q4 H* ?9 w: C. ~        {+ i! d4 ]; z8 z4 J3 j6 k4 s
                pc = branch_target;
# v1 c7 m* r7 w        }
& {- v; }3 B* k) g2 {8 t        else
+ z4 S' e" ]( Q8 N$ g+ ~( X: k        {! d8 R: D$ L$ o
                pc = pc +1;3 O  Z. O) L5 b4 i. i
        }' k3 w" Q8 A' k6 v6 h9 Q
}  j7 ^/ n3 r4 d) a& V& N

" _8 Z- j3 `; Q' P6 Y. `4 B: j
3 u/ ?* R) D5 D7 R7 h9 E2>alu模块
, [( r. e+ b. F. K5 balu模块,大家都很熟悉了,是执行单元部件,负责运算指令的运算工作。- f1 M1 r6 f; ^3 N

1 i" \6 h# X2 h# A; Z7 x7 ]这个模块的输入信号是有控制通路的解码出来的操作数和操作码,输出信号就是运算结果。
- ?& p, E7 e3 X% P4 v- |4 x3 ]7 j/ F0 E
( Z: l" `. R: z- x, ~# [需要说明的是,这个模块可以完全是组合逻辑电路。2 T7 H# R3 L/ Z* @  i# Z: L( v6 P
+ ~$ g' p' \. x! z+ ]

7 E% P) }4 B" E
; e. ]5 z$ D) ~$ V& O) V3>RF模块4 a4 S% p& f0 W, h2 f- b
register file模块,从物理上来说,就是一个block ram。
& H4 Y* Q7 H, O8 C5 {. l
- `. G9 F( n4 `) |. d从逻辑上来说,这个模块是对软件程序员是透明的,寄存器堆和指令集是软件和硬件的交互接口。
: V6 b& q& j% o, W) d" v
1 w, f- x* ]% }1 W$ H' D; G
2 n% n8 ^; b  ~; ^% Y
1 T- O) y8 x" H% ^4>stack
9 U* @  R$ r  y% ^stack(栈),是用来处理分支指令时,存放PC的值的,比如,我们在处理子程序调用时,需要先将当前的PC+1压栈,等到遇到子程序返回指令时使用。
# a5 p: r* q2 S- y6 M' ]5 s7 r( k4 }( C! c8 s$ I- I
栈的特点是LIFO(last in first out),这一点与heap(堆)不同。
9 C0 W" J& q/ J; h% @' _: H, b5 y1 n& r4 ?. P

8 t, v: j  S9 b) n% W! o7 k
5 N1 P" W" [" r. \$ x5>ctrl_path模块
1 ]" e2 s' s+ [: u; w9 W8 I控制通路负责将genpc模块产生的地址处的指令进行解码,并产生对应的操作数,操作码和控制型号。这部分信号比较多一点。
& G6 L( C- ~% T  a1 V" C2 z. Q' i* Z
' a6 M; T- K- V. j9 H

0 s$ g9 n+ L; A$ o6>tiny_soc  H# F" E  |$ q$ k5 X; \3 P
为了测试这个cpu内核,我们需要搭一个最小系统,包括指令只读存储器insn_rom模块,里面存放机器码。& u) q2 j/ ]5 x+ U

. Y- E' F. u1 t% O6 j9 G+ ]+ U7 E由于是harvard结构,所以还需要一个数据存储器ram模块,相当于内存。) z0 C% `9 T2 m/ |- O
2 ?( W# w3 E& r7 h
当然,如果想外挂其他I/O外设,我们只需要定义其地址空间即可,需要说明的是I/O外设的地址空间不能与RAM重叠,各个I/O外设之间也不能重叠。# K4 o( p8 m( [

. x6 e0 \  ]  X  W# X3 t  sRAM和I/O外设之间可通过一个arbiter与cpu core实现数据交互。
, p4 P1 G  O6 R5 Y# n+ M0 ~2 U  d& K0 q3 z1 k" p8 ]5 a
当然,如果存放指令的地方不止一个,也需要一个指令arbiter。
% \! Q$ q, V7 b# @( K6 e
+ g# W! S" U8 l4 G5 E. ?0 y8 @
* f5 G1 B% ]3 u- F5 E
- H4 l  `0 g3 g! L4,RTL实现& j$ h0 d+ M) z) I; G) D
在完成模块划分,接口定义,仔细分析考虑模块间时序之后,如果没有什么问题,我们就可以进行编码工作了。& H6 P- i7 m6 S* r
) ?! N6 O, d. g/ a# }2 ^6 N
编码,需要注意的是编码一定要规范,信号命名,代码注释什么的,尽量要仔细。这里直接给出RTL代码(verilog HDL)
% {; S/ Z0 u& c* z3 U
- p1 w* d2 h8 N/ K按照自上而下的顺序依次给出:: D& \! [/ C0 f; m) P
) }4 j8 ?+ c: B- q
9 ]: |7 Y7 |3 o* x' c1 ^5 ]

4 k  \' r$ ]0 p- n( F1>tiny_soc顶层模块:soc_top
% o* L& b* t4 Z+ x+ k+ S0 S6 p
2 j4 L; H8 P! T( ~7 I- z0 y
; N0 B: ^; H% \" J8 i- l
" p- O7 ?2 u+ g! i( a/*
0 t" B( [" E% `7 p*
/ W$ N8 M" w* `6 y4 [0 h* file name        : soc_top.v9 g0 T8 r" O( G* J
* author        : Rill5 `! q2 ?$ O* M' W; I- L+ a
* date                : 2013-08-11
- a  k1 b, F0 M! X# B7 f*
  J4 `) r/ @' n4 t8 Z: E- U*/  |8 V" ]  _% a

% ]3 U1 o% I! Y1 A; B8 J+ C`timescale 1ns / 1ps, z! M% [2 b- {+ ~2 u' e2 w
( F, k4 X1 }0 I1 R% C7 D7 Y
module soc_top
. m2 \. A1 S  o3 A$ q9 Y" o(
& E1 \/ k- G( `+ q& |; iinput clk,4 h  M; O, w3 L) f+ v: A& H
input rst
  l- @0 b+ K$ s$ M$ X. n);; V- b8 h1 ]8 b5 U' q

- y  D2 P7 f. t" i* @4 T" E/ I / L/ B, g/ w9 I- i
wire                  read_e;& v) b) F* k2 U1 U0 K3 ^1 A
wire                  write_e;4 h9 o* l: C' X1 Y0 S
wire [7:0]         port_addr;9 j! H& }' i$ Q7 z6 d
wire [7:0]         core_in;: h4 u, E7 {9 R5 z; B2 P9 l
wire [7:0]         core_out;
5 c# s  q1 d! n2 T6 h/ i) _wire [15:0] instruction;
. k0 }# |7 t: \% f+ T/ Hwire [10:0] inst_addr;3 X& P$ T" [$ o7 d) G! ^! C9 v5 U9 P

9 s3 R' m/ l/ Y  A3 e+ Q! T: I; t1 awire [15:0] debug_insn;! @; s* j; y" V9 m% h# h' l
wire [10:0] debug_pc;# b" {' v! C2 D( n# i3 R

* e2 x2 A2 }7 U# q7 O# ^/ ]9 kinsn_rom insn_rom7 }8 V. D2 Z$ e" H+ |
(9 P. x# ~" I( h9 t5 H+ B" w
.clk (clk),
7 D6 Q  s& ^$ W# e; K.rst (rst),
; g- x* n& o5 Z.address (inst_addr),
0 {7 i- l6 K9 U# @4 F- ^.instruction (instruction)* q, T7 |0 a: c9 a, ^% Z* ]
);  Q3 p  `9 K. W
, D0 e9 g* ?5 `3 e: H+ i
core core
8 x) m3 b. q0 e(
% ~- I. ^8 a$ C2 a$ j) B.clk (clk),% n& u/ {1 r6 {" y# y
.rst (rst),5 _; Y4 n" G1 Y/ e+ O+ X
; T; L% l9 M% ?, t2 o4 q, p
.read_e (read_e)," d  L) x# D; p8 q0 a4 q% e& a' ~# t
.write_e (write_e),
( v5 c1 y- @: C1 C( ^/ [.port_addr (port_addr),: W1 r6 M( f0 U7 J' w' n
.data_in (core_in),
4 _7 \* k3 C( l9 x% ]( q.data_out (core_out),
3 J: S5 L  d# c9 B$ d7 F8 O0 E.inst_addr (inst_addr),! v7 C0 ~' D+ F# \1 ?
.instruction (instruction),
$ A% @' o1 W% g2 i2 f2 Z.debug_pc (debug_pc),
! h% v& k2 I9 a# O. j" R.debug_insn (debug_insn)3 _; ~; W  W* \
);
$ M! _+ V! q$ L, @' m4 {% `
9 Y% K3 V) H5 C- K( n5 a" Iram ram
, a* m( D' @$ q2 s% }( Z7 h7 M0 ](
; G. Z3 m: y+ L7 O% B.clk (clk),; g, b+ R* H4 g
.rst (rst),
6 b6 i) u: N1 _8 {
# h. r8 G8 g1 Y# }, P.wr (write_e),% {0 U* K5 k1 b2 Y+ R( r4 q9 i( W
.rd (read_e),
" _2 l+ n2 ^" m7 X, J) Z! A' `.addr (port_addr),
# ]0 t* f5 C* k2 N% c" Q.din (core_out),* Q2 `7 L+ `1 u7 |) u9 A& c1 o
.dout(core_in)
5 m! q  F' T9 W1 S  X9 x);' R( F4 C: Y: f( C3 ~! _
3 y& A4 m- |5 Q& L
& p5 J; A8 U$ G, B8 |3 [1 x/ B
        $ @) E2 z3 w. X7 T7 W
endmodule
$ X3 W# _0 ?- `4 n/ p5 ^% w  {1 K6 e; B" ~
; @2 @  M$ ^/ L
. {6 |5 U8 g) p+ k
0 I: x+ t& Q9 W% `
2>指令存储器:insn_rom
! a' G- D" G" y* v* ?) A" ?  U0 h, [. s4 F% E( E
7 j9 j# e  s9 p/ t: s% ^: z

  m- _; U0 c+ j- W" a4 G/*
. W# H, q9 a& B4 _$ _0 @& \*
7 l  {5 a6 d. ?3 M! l* file name        : insn_rom.v  i# F4 J$ K" h, W
* author        : Rill' u, u) p: y0 S, Q% ?
* date                : 2013-08-110 T- v3 V& X: u
*
. s2 v, `$ T) }2 V7 y: f*/
5 K+ k) l+ h, f" C ' h1 L4 c7 E0 [& T# {8 _
% p6 ]# G' x; ~5 G
0 ^2 b! n( H% I+ K6 z! O
module insn_rom+ ?) a1 w) Z9 X8 r1 r7 f
(# @, W8 T& N3 \/ Y! p" W, l& A
input clk,# l5 t4 G! p1 B$ ~$ _/ Z- v  L
input rst,2 W- G- W- e' M8 K. s8 |% ^1 t% e
input [10:0] address,
- M/ j/ V- a. v( p0 y2 w) Voutput reg [15:0] instruction! g% _/ m" m: p$ [+ \1 w- a8 [
);6 I3 s, R" c8 l+ l* K
+ [* }# Z& A9 T. y
//(* RAM_STYLE="BLOCK" *)
6 i: d) c$ R/ U' L+ H* s2 preg [15:0] rom [2047:0];9 C6 s6 X5 Y$ n+ r# T

8 x2 N1 i* T1 R$ o& L- Aalways @(posedge clk)
7 y- |0 h2 T) l4 f; jbegin
5 W! Z+ Z, L  G" h' u; y. c        if(rst)
$ @) u3 e$ _4 V( s* r                begin
( j' i& x) b1 Q( a: U  @. s' ?                        rom[0] <= 16'h5801;//0:                        jmp start
5 }( o( w. A- K0 M0 v( ]  w                        rom[1] <= 16'h1101;//1:start         mov r1,1
7 x0 ^9 y$ S  ]% p8 b' K% t                        rom[2] <= 16'h1202;//2:                        mov r2,2
/ P/ ~/ {: }3 \+ [# s! n7 ^- W                        rom[3] <= 16'h3220;//3:                        add r2,r17 _7 J0 _" l2 W4 _# A
                        rom[4] <= 16'h2237;//4:                        str r2,557 ^$ L+ h. [) d3 l6 U1 i
                        rom[5] <= 16'h5806;//5:                        jmp end: f& l* w) O: [" K7 ~
                        rom[6] <= 16'h5806;//6:end                jmp end*/
% \2 B4 _0 y8 L5 ]& I7 a) ~0 w9 b% n                end/ Q1 {& F5 H% ]" H% a
        else6 n3 t% [! i6 E+ m, ~0 m- S- l5 F
                begin
6 H* |2 ?, r5 M9 \% R% H7 F                        instruction <= rom[address];
  _8 |9 E/ F/ ?0 n                end
4 R5 A  ?  E- ]; Yend
  B) X2 c3 z8 Q# p2 R
+ D& R# T) U' x5 T
- s2 D' r; I- q. rendmodule& k+ s6 v, k0 s% h6 t8 T3 p0 u

5 L  `3 r) S- N# d* X: V# N! I  f; q8 |5 J$ n3 U1 a
3>数据存储器:ram
8 ^8 h" }3 E" I4 N) G! W( \0 m% m7 Z8 r
9 L+ Q1 K! g6 ]# j: C  ~
, G; h9 r0 g! }% N6 s  ]
*
: m" p+ F5 i, U. p2 q# j! K( w, g*2 y1 f- x3 z# l* s: s" v/ }$ l: n
* file name        : ram.v: Q5 k2 Y% q$ T5 F* d4 ?
* author        : Rill+ l' R4 g* n6 {5 s
* date                : 2013-08-11' b- f/ o" L0 R4 G8 P9 x
*
' x$ \' u8 t+ I*/# B+ ~7 C, l# n6 U8 _- V% C& i( }
5 u9 |. N) V7 M& g" L6 x
* N* B# r, w0 W2 m
module ram($ S8 N! z: _$ s4 G* n9 i: n
    input clk,- H, C6 m6 l: H3 Y' }
        input rst,) c8 A& t; X$ J9 K- @
       
2 Y0 y! m; P* x  r8 G4 k    input [7:0] din,
5 p! R! W# F  \* \0 ]: V    input [7:0] addr,
* G! ?( |' b8 K. Z* l    output reg [7:0] dout,
- q: g; a$ d: z4 m    input wr,) E( W8 n  H. l$ A( ?
        input rd9 X+ c  p1 @5 z3 W' ]2 I
    );
* Z3 H4 _. ~4 `/ K   b1 c& y, @6 q* k
   (* RAM_STYLE="DISTRIBUTED" *)1 [4 N1 H& g* {2 g4 P/ s9 e$ p1 F, m
   & k/ k# D. O$ y: l3 |' s: d
        reg [7:0] ram [255:0];
7 O* J8 f; u0 k) {& ?
' e+ k, M* n5 Z' T1 o% i   always @(posedge clk)
0 ], [6 q9 t7 G2 d+ t; P' [        begin
  p. A2 n' J  ]- T& ^                if(rst)% r! N6 I; C' Y4 d* E: Z
                        begin
' n& l) H9 b2 s& h# O                                dout <= 8'b0;
5 I6 k. Z0 {- W& J                                ram[0] = 0;( v* P* ?  S( F, a) k$ M
                                ram[1] = 1;
0 ?* _0 `) p2 u& J6 O$ @                                ram[2] = 2;
- S7 H7 @. x6 L+ a                                ram[32] = 32;
# E5 ~. y4 o3 |& ^4 ~0 |; _/ `                                ram[64] = 64;% D5 X" z' T1 C2 |6 w" Y

: [7 R+ M- ^8 L" a- e9 F$ e                        end* V# q1 {2 ?, i
                else
- l$ ~& |; X3 F1 Z" G5 B6 _                        begin
# q1 G5 }( R# z                        if (wr)& U1 W( k# F$ P. _4 L/ A8 x6 R5 O4 e
                                ram[addr] <= din;2 X! a8 C9 l/ S# G4 a+ Y% @. U
                        else if(rd)
; d) K. e5 ^0 U9 @: {                                dout <= ram[addr];- a2 Q- Z) b4 U
                end# o6 U) P1 n: U$ K0 Y
        end
# M6 s3 z9 m: N0 V! w4 a$ f
! r- [2 Z$ w& Y6 ~, I& Vendmodule
1 u- J! w' i8 S
3 e' A3 M4 }% I% N# [
0 p6 u8 G' E7 S% C4>CPU核心:core4 R8 P. e+ z3 s  m$ G# O' V

8 E' @# p6 M. p6 v# `4 Y( s$ O1 {* |" n
( g3 @( U+ I2 @! W
/** F/ @  `& j8 a- P& x
*
4 D! m+ q5 D4 a, N* file name        : core.v
6 u! j. w6 Z) {: C* author        : Rill  n) M& {  D4 [4 w2 T
* date                : 2013-08-11
9 F( v9 g& v/ e  J( |" ?*/ {" z$ E7 N: a' y% t
*/
" ?, D. o8 B6 @3 w   _! `8 N, v4 b) k7 P' j

2 ^) ^$ z. m- K+ r
7 y/ E/ w( Y0 F3 a# B+ T7 Y! a( c5 mmodule core
9 Y3 n3 m$ ]3 o, y(
% J1 _/ \( y( g, Y    input clk,: [, H$ G6 k9 f, W
    input rst,: D' l# C, s4 ?6 o& Y: [0 z; d- T
    output [7:0] port_addr,
# D0 w4 Q3 Z1 ~& r9 C( o8 L    output read_e,
6 M+ x2 H# B; \" a+ e' g7 D4 E9 Z    output write_e,
5 r/ g# D+ y1 d3 C  k    input [7:0] data_in,$ B7 J$ M9 O$ [8 T: t* s0 O
    output [7:0] data_out,$ D! |! k4 E3 p, H& ?( A: X$ A; R
        output [10:0] inst_addr,6 D4 ]/ `8 D( j- o3 I" D
        input [15:0] instruction,% k: r0 c4 \3 Q+ V, C9 j
       
2 j: f" e/ B2 Q% a" v        output [10:0] debug_pc,//debug i/f
  B, t1 [. y$ F6 O7 s( y' m        output [15:0] debug_insn
! ?5 V' D6 I# Z);* G2 v7 R  l6 z0 f7 s. |. g4 F7 v
4 ~% w4 n, C& M, j
wire z,c;) U0 o6 L7 K0 J$ Y4 u
wire insel;
4 O& b& b& [2 @- W3 f; p; Nwire we;, N) m9 y* N" N# a5 R& N+ n
wire [2:0] raa;& a. C$ W4 X* z: H
wire [2:0] rab;
$ r" R, v; Y. I9 F8 _" Gwire [2:0] wa;7 z! p% W+ V+ ?* }
wire [2:0] opalu;7 n- a9 W0 k! M* g9 H  R+ O
wire [2:0] sh;0 b$ o2 s5 i) @6 k
wire selpc;1 T- q  S% z( u* h# X8 I  D0 i0 H7 V
wire ldpc;
" B" j% r# B. G' ]& O2 z/ W9 ?wire ldflag;" w: G5 R' b1 C5 j" c
wire [10:0] ninst_addr;
: w" a4 F: N0 I8 G# ?; w. u0 Z  ?wire selk;9 e  ~5 t8 _/ B2 W0 i; q9 f
wire [7:0] KTE;, l* V' v, |( Q' Y* P
wire [10:0] stack_addr;% S. o' U0 f6 W, w  M8 n
wire wr_en, rd_en;
1 D2 r! S+ j9 bwire [7:0] imm;
: T9 O' M& ?. J0 w% ?wire selimm;, \0 F4 I# R4 F7 }6 \% ^- ]
. Q( T, \" Q' v: `( t1 {4 h
1 W0 N) ^/ W% r  q

& Y4 y" e$ Y" C& V0 b
5 z$ m% w6 b% h- d0 H; Kcontrol_path control_path
8 R1 F. v) Q6 r1 ~; f4 E(
0 [4 p4 Z/ S9 _& r.clk (clk),  @  U: O5 t  W8 W3 T1 u! e
.rst (rst),
  K# [$ J$ O4 i' @% }6 N.instruction (instruction)," l' ]# }' C' Z# S/ N
.z (z)," g# e1 w! U/ ^3 Z+ S& ^8 ^
.c (c),
" Q% T; W/ a7 q* x* }.port_addr (port_addr),
" x' p; C7 J( U3 s.write_e (write_e),  \7 T2 D% {) a7 |/ L/ C+ A3 l
.read_e (read_e),1 r9 T) a& u5 |0 D: ~
.insel (insel),; ~1 E9 o' T9 J: |
.we (we),0 B; A* b& Y8 }5 J% P5 Y
.raa (raa),
+ h( S& u6 A3 u! T0 `9 k.rab (rab),
" D: `& Y, s) q! p9 d.wa (wa),
$ [* {6 w: q7 p! s2 V.opalu (opalu),
0 {+ d7 T7 }4 Q  D/ y.sh (sh),
9 E/ a* z/ t7 c; x$ V.selpc (selpc),/ G" ~* e9 r5 A2 {% i. D
.ldpc (ldpc),
7 s+ N1 u* h  P9 X# A9 F( v.ldflag (ldflag),; T. R5 M) f, x% f" R
.naddress (ninst_addr),9 `- S4 V5 a- x& _
.selk (selk),
1 g+ W+ k: x0 q5 \7 Y! C.KTE (KTE),  K3 D5 L. B% x# l
.stack_addr (stack_addr),
& v0 u( M0 i7 ]4 A) n1 _( l.wr_en (wr_en),
( V- c% g' p( j.rd_en (rd_en),
% k( `# \9 P* Z* @# x+ y- ]( p.imm (imm),
5 a& @6 R# Z1 w, h& M* y.selimm (selimm)$ f* h8 t$ ~2 B5 M5 `! ^" \
);
  w6 {! r4 Z" q' A. h / w8 o4 n; w, X- H5 m! ~0 D; S( F

3 f4 y2 \7 F6 U/ i 6 x/ U$ R: y1 W6 h2 r8 y3 Y; _
data_path data_path_i! g+ e$ M5 \% |$ F; h, o+ p
(8 w6 }9 _+ O5 Q/ `% `/ l) Z
.clk (clk),
' A+ [* F# k7 {3 e$ d7 U- |.rst (rst),
! B+ E. v" I. I. j5 a0 r.data_in (data_in),
! I2 E1 _% i% }5 X, ^2 y.insel (insel),( G4 V, F: v, f
.we (we),
1 s( s( J# @, f.raa (raa),  T; i0 {+ {$ Y2 G8 B
.rab (rab),
3 G: k  o% I- h  U+ D.wa (wa),
5 k$ d- `2 \- J8 l.opalu (opalu),8 ?+ x9 X6 [" z, {( l( M
.sh (sh),5 q' x7 v" n) A1 B$ e+ b
.selpc (selpc),) d# s$ U8 e1 r5 D" T
.selk (selk),$ F. z" K0 ^# h) U- s
.ldpc (ldpc),; t1 D; _6 O! g  E1 ~. U
.ldflag (ldflag),
7 [" Y1 r* O- w  g.wr_en (wr_en),+ D5 T% A9 U/ O
.rd_en (rd_en),
: d( j3 I! J' V9 A5 S9 l.ninst_addr (ninst_addr),& P9 F! Z3 o( p5 Q$ S" u4 `0 _
.kte (KTE),- `) n, U4 b/ ^& [/ @8 r$ J+ L7 o6 w
.imm (imm),9 F) \. ~; g# S
.selimm (selimm),; N3 {6 q3 h, W" e' [8 g
.data_out (data_out),7 z# E2 g) k' R+ ]
.inst_addr (inst_addr),0 M; I% m# F' z6 A. b
.stack_addr (stack_addr),
: ]( J' Z4 h5 E( t, e.z (z),
+ Q5 {3 x/ N, m- z7 p.c (c)
' ~0 ?" V+ s6 w$ X6 l/ w& w& k! _8 @- {);' h( \" |7 V! y+ ?

) G3 v1 Y) ~+ V. c, Bdebug debug
% q: l5 H0 v5 H/ N(* C9 j0 J# q' Y$ O0 ?
.pc_in (inst_addr),% S, M6 k) n% Y4 t
.insn_in (instruction),
  U7 t0 p( v; v; \- H# f
$ v% b3 }, v. O; t.pc (debug_pc),
7 O& M: ^# ?* }5 @4 v' [  g.insn (debug_insn)+ `4 F% E% O4 K. a5 H% c( }
);# X. t; {+ L4 u" l- [+ r8 p
/ n8 A, P5 Z6 Q3 [3 I* g" y+ I

( J* S& h2 P( T7 f! P/ Uendmodule  b) P) o! Z3 O  C

5 Q; i! C4 P) ?! W- d8 l8 p1 m9 n# l9 u& A2 R. H
5>调试单元:debug7 u' `6 G$ Q* }: v$ H. q7 {# g

/ ^4 g/ }2 |/ c. k
  V0 m1 L: Q! G3 \; w  i" Y
5 E5 j* _$ p" K4 V( |& @/ i" c/*
) z. k" r; G  P- ~8 C  x: L2 O*7 u! k& A) L" t0 s1 L
* file name        : debug.v% e' o$ b' a1 ~1 q  w
* author        : Rill$ }- x8 A8 j2 d- b( J* w) \7 U
* date                : 2013-08-11% |; q4 j! T1 ]/ R
*2 f  a% J" f1 `' D
*/0 \; y* G; {8 X8 K

: `  d! O. ~% ]4 f4 |: U' m; a+ V
# [4 [, q+ H8 `" Y- D' a $ T! C, q2 A  b$ Z, X% N+ u
module debug
& @% n7 R2 V1 ^+ g(
, V$ J/ b% F8 b8 O/ T; yinput [10:0] pc_in,2 f; t- |4 d) W
input [15:0] insn_in,4 P! Z* K1 \2 p: N

6 z3 p2 W: h: H. r; {$ h  F6 coutput [10:0] pc,. a* p1 K) O1 K5 e( Q* X: E! Q8 C6 T
output [15:0] insn5 L8 K, _& S3 [0 ^
);
& ~& H9 c* |: p$ V+ Z. V' ? ' N6 X- c! L8 J: x3 o4 w: F
assign pc = pc_in;9 w7 V0 \" n" z- v
assign insn = insn_in;
9 n3 w5 z6 h, M+ j. `. v! d
5 N) A9 {" p0 @! `! i( lendmodule
, j- R2 D9 N' r; ^2 I; T7 a1 E% r1 p7 _

1 x/ U6 @- l9 e/ _. M0 Y6>控制通路:control_path% W& X# F/ e. n5 I# `$ E

3 K( C% S, T& o5 \/ \' M
3 V6 q3 @2 P4 U1 L# ~5 q
9 R3 q! X6 R' F# _/*1 R; W" Y3 @/ ]; k2 F
*# R! ~: C! f4 r& g$ n! b
* file name        : control_path.v5 e( J) @0 b0 T  n
* author        : Rill
/ l% \" D$ v0 o: I+ [' b. f* date                : 2013-08-11
" _6 }& j% H8 }/ h" s1 c' O, x*8 p+ D4 |' k! g; d  y  B
*/: A( ?, y4 a0 ?2 c- h" v1 q( V
+ R8 R' \  w; Y" k' n9 \0 E
7 w" |1 H, J8 Q: s/ D
0 n* z) o  V. T
module control_path
6 f) H0 g. X; c- k(
6 z- m7 ^/ ?& \; Y    input clk,' t0 `! V& L0 F8 [- W
    input rst,. U% G- E$ |, `
    input [15:0] instruction,
+ ~+ P1 {' p, W$ r1 P1 z    input z,
2 F! s: p* N9 F. q. {    input c,
: I; R2 R$ F3 x3 X6 a    output reg [7:0] port_addr,
: c! z  z9 e8 X- m8 F' C: _    output reg write_e,
1 @* T* o( L, U" F    output reg read_e,
7 r0 E) I" D- b" G7 z' A# _+ J    output reg insel,
* k/ _. |! j/ o0 M0 E6 X    output reg we,
. C6 h* j/ x1 d( `" b4 Z    output reg [2:0] raa,
* A# @" e2 k3 m& _1 L  _    output reg [2:0] rab,2 c( a$ [' f- M, ~6 n; N! U3 l
    output reg [2:0] wa,
9 F2 ?1 y/ ]. s4 I+ C2 O, d0 F8 I# r    output reg [2:0] opalu,
" Q' J* g& i  E% Q0 _- c    output reg [2:0] sh,1 M3 i8 q0 g! S; h
    output reg selpc,
9 i. ], S2 w; ]3 @0 ^5 c    output reg ldpc,
" f9 e2 t' L" _    output reg ldflag,
  \. H& K: [8 t- \    output reg [10:0] naddress,
% }% v6 T9 p3 w3 k, H    output reg selk,7 V0 P2 s5 H( V8 D, S7 H
    output reg [7:0] KTE,4 u' a! W" A6 h, s1 F' _6 K* m
        input [10:0] stack_addr,
: z, ^5 |$ `) `7 w0 t' ~        output reg wr_en, rd_en,
0 ?$ M; r0 C* \4 C6 p        output reg [7:0] imm,: [3 y0 \) `  Q$ @& y0 r
        output reg selimm
, V( C+ c3 Y& R. A    );
  z$ R- V7 x+ l$ C1 t % J  A( P. E% [9 ~2 `

6 [* v+ \; m$ E" ^* E0 Iparameter fetch=        5'd0;
' s8 S& U  L7 [# Kparameter decode=        5'd1;* c$ m( f9 D4 E6 m9 k4 O2 Q& K6 `% {
: Z: [8 A3 e' f' _. F
parameter ldi=                5'd2;% ^+ d6 `( a3 H* {6 B
parameter ldm=                5'd3;
  l7 S1 u% F: t' iparameter stm=                5'd4;6 o/ [, k* C) M
parameter cmp=                5'd5;* \5 H: a! |0 G8 ?+ k$ d) K/ C
parameter add=                5'd6;( r+ r5 }3 _- ^" h9 }
parameter sub=                5'd7;
% w# I  \" k. u* Gparameter andi=                5'd8;8 t  o7 U: \9 Y
parameter oor=                5'd9;- i; A/ N/ c& _  s2 c. O8 `
parameter xori=                5'd10;
* c' h, i: W% k0 c" F. y. Jparameter jmp=                5'd11;: \" N2 N; M& j' f# T9 l4 F- I
parameter jpz=                5'd12;! ^' |% f5 n2 y# {9 m: I6 Y
parameter jnz=                5'd13;# o6 K& a5 c+ a- x% P* K
parameter jpc=                5'd14;
2 T/ [6 {. h& j5 Lparameter jnc=                5'd15;
: t0 G) Q  w" n; A0 Cparameter csr=                5'd16;- m1 a# `$ i$ y" q9 @; q
parameter ret=                5'd17;
% d2 |. P7 k- Q! z1 f0 @
* j$ Y; |$ s/ I' ^parameter adi=                5'd18;/ g/ f' ~3 V9 C3 V5 y
parameter csz=                5'd19;& ^/ b+ D" y8 |
parameter cnz=                5'd20;1 \1 _" W. G9 C5 ~
parameter csc=                5'd21;
6 H1 d2 B2 V1 X- W- F% oparameter cnc=                5'd22;
* p9 i" W# B" H1 d# D3 Oparameter sl0=                5'd23;" J# O8 F4 J& ]
parameter sl1=                5'd24;' }" j- a. p  A8 y; o
parameter sr0=                5'd25;
; d$ r: t6 z0 [; l+ ]2 K- p) Iparameter sr1=                5'd26;
3 p/ i( _5 Z! a2 E# Q1 j7 E* B0 yparameter rrl=                5'd27;" F, }' y  A0 H1 v0 K
parameter rrr=                5'd28;
( Z* K- R) u1 b( o1 e5 zparameter noti=                5'd29;& O0 U; Q9 _  u

' }. i+ b% ]0 q  A/ k: Aparameter nop=                5'd30;: `4 _9 N3 u$ K, b+ i; `

6 |* R" n- j% {3 O) D; ~$ b: awire [4:0] opcode;( `! @1 S, ]  L0 h) j! r
reg [4:0] state;
& q+ ^9 X0 w% C& [
( Z* Y" e' x4 ]9 Uassign opcode=instruction[15:11];! e/ }1 u! |& i$ a
2 @8 X* k/ o5 r: z
always@(posedge clk or posedge rst)
5 N1 U7 Q+ ~* X: K; Y  P8 obegin
* Q" h$ x+ o% z  R8 `        if (rst)
- S9 E) ^7 M% c3 A4 M                begin
6 D! |# k& k  B                        state<=decode;% F8 x/ R  s# ^: [
                end( n7 _8 P2 j/ a. ]
                ( _0 V0 p. @4 D- d, ^
        else  [; L9 u1 }# u& V+ p6 Q
                begin. b: ^* p- b$ t- E1 G
                        case (state)7 a% X. a4 L; P) o, R
                                fetch:
9 ~( c; n! y1 ?8 a+ v7 l                                        begin2 J% {# t7 N4 `2 `# U- d2 c
                                                state<=decode;
7 |7 ], Z; T7 `5 W: L1 \                                        end
1 d7 m- Y( d+ c3 g1 \ 8 v% h' _# x8 d+ L- \! X
                                decode: ' k8 q  ~; @9 W/ f  U
                                        begin, Z4 _) y( v/ l# A0 M7 |$ Y
                                                if(opcode >=ldi && opcode <=nop)5 O! ^) t5 O# w* {
                                                        state <= opcode;//state just is the opcode now
( x, q  e) B+ e                                                else/ E$ g! x! X; s- r" ~3 ~
                                                        state <= nop;, W; u5 j* G, |4 J
                                        end6 b6 A4 [, u" E7 s2 B
                                        ( Z1 p' Q. E  t0 _! t. d- d9 O) E
                                default:" N/ R+ ]3 M7 r! g% N
                                        state<=fetch;
& \1 g8 t& r: O9 R& T                        endcase
) @4 U5 e! R/ M. {1 q1 w* N! `                end
- e2 S: @; d& z1 A& r. O( C               
9 f! L. O( Y: v: w; vend        3 n5 s8 {4 G. v2 [9 f0 T
( p, d+ M; \/ K+ \4 ?
3 p+ T0 w# p7 k/ V% u& ^5 `2 N2 W
always@(*)
" f, C9 U8 [: x% }$ u, }9 z9 tbegin
4 U6 Z  y+ I- v& g9 e* q                port_addr<=0;
/ E! q" v2 q6 T                write_e<=0;: h& c4 o  F9 |) a5 {* X
                read_e<=0;
: E, z' C: x% X) s% e8 p4 M: h                insel<=0;- g! h% r! W+ `. S  R) g9 {5 R
                we<=0;
) T. U3 a8 u6 i) O; `                raa<=0;
4 _, d8 N5 C( S                rab<=0;9 r* c5 o- y8 `* K3 J* {4 f
                wa<=0;- i3 T( ~' D: W( k
                opalu<=4;
, q# k6 I6 c; I# W                sh<=4;( @1 V6 ]' Y) F
                selpc<=0;
& n5 n" L+ I3 X+ e) o# y  O9 w. U) a7 p                ldpc<=1;
) o* v4 b) m3 x& k7 M                ldflag<=0;4 K. D6 Z! e. t! L1 |; y+ q
                naddress<=0;/ S* D& l5 A6 Z7 h9 J+ `) V
                selk<=0;
  j8 n1 _2 V9 {) |                KTE<=0;
& b# M9 Y3 V8 h# a3 @* J1 B7 E                wr_en<=0;; I  x# w% V9 P9 d
                rd_en<=0;
% C4 e* ^8 x" Z5 T5 Q- f                imm<=0;
. l8 P6 M& B0 [; X                selimm<=0;
% ?. s4 [/ w7 k6 C8 v! h2 w                ) c7 D6 y# Y) v6 \- W! `
                case (state)) z% M& h. ~( i% E1 n3 U# b
                        fetch:         begin
* Z; Y: X) B4 d; P0 u                                                ldpc<=0;) U# J; _. U1 k# S6 Y4 ^# ~
                                        end$ \( L2 r) u& f+ Q
: \- I1 Y/ d: r& l6 L
                        decode: begin
: N, h! s) h/ G: u- w                                                ldpc<=0;
, L! [  @- N0 s. m8 |; P! V( r$ A                                                if (opcode==stm)' `4 ?1 ]' @. i; w; |
                                                        begin$ W6 S! C4 O2 \' P4 c. f% f& [( D
                                                                raa<=instruction[10:8];$ r0 B1 N* o$ T2 ?5 _
                                                                port_addr<=instruction[7:0];7 B. t5 _! w. X4 B" s8 Q1 J: x
                                                        end% Y9 A4 G+ z  d  ]& o
                                                else if (opcode==ldm): }4 _1 G7 r4 o  ?$ g; l( H
                                                        begin7 {7 Y3 e9 C* ^, A' o5 h
                                                                wa<=instruction[10:8];: E- l9 s( `  {8 N4 ]5 I  t7 S
                                                                port_addr<=instruction[7:0];
) k9 d3 M$ K( @6 `                                                        end! w5 d- s5 j: T/ o
                                                else if (opcode==ret)9 i: {& Q3 `/ P
                                                        begin4 q7 E/ s. ]5 Q5 ]5 v+ Z
                                                                rd_en<=1;
) L4 S. R4 z/ f1 j1 b- ?/ X6 D                                                        end5 [. K3 f! _- [" |; B; |' B
                                        end
: l% Z# k8 G/ {3 l; r) p                               
0 X4 u3 |, I/ f9 j4 o9 j                        ldi:        begin
! x8 V/ X5 i8 a' j2 d                                                selk<=1;' e" i3 }7 ]! i. l0 {+ B
                                                KTE<=instruction[7:0];
; c- ~) n5 @8 x                                                we<=1;. Z9 {5 _. T4 p
                                                wa<=instruction[10:8];7 t) c) P* W# F
                                        end+ G* r3 q& G8 x
                                          I- Q3 z0 t  b' Z5 I3 V  S& N
                        ldm:        begin" M( B" P$ A- H- Z
                                                wa<=instruction[10:8];
9 S5 l* d8 x  h8 q, l: j' V                                                we<=1;. y9 v& L5 I7 X6 \, o! ~
                                                read_e<=1;
' x+ N+ ]( q( {  v9 a; k6 ^                                                port_addr<=instruction[7:0];2 P" {7 c% n, b; V! I9 `
                                        end
/ ?; w/ }7 p; t% a8 r8 A0 U                                       
7 e$ M2 M; z4 h                        stm:        begin
6 {$ X. W$ N) ~                                                raa<=instruction[10:8];
2 r) X# e8 {- K* @& w1 ]                                                write_e<=1;
2 y6 s! Y, J, E5 }, B7 z                                                port_addr<=instruction[7:0];
+ H9 L8 O1 m) e* c                                        end
0 b7 j' Y# E  a3 v# ~                                        . {! k1 n6 O# B2 o2 c+ n% }  `
                        cmp:        begin+ J- ^  c6 Q1 n% G' d. z' a
                                                ldflag<=1;8 Y8 q0 g7 Q5 v. S; V8 q
                                                raa<=instruction[10:8];
* J& j3 A" r2 W3 r' m+ P                                                rab<=instruction[7:5];
" L9 y9 M, L5 L5 N& }" \) O$ g! q                                                opalu<=6;' k* c3 ?0 `6 C; p
                                        end, b, Q9 H  X4 @2 C* e: [0 m7 T
                                       
% q. l4 \5 g8 y" x                        add:        begin
" P7 b) H7 S; A$ ^3 n$ [2 Y+ O                                                raa<=instruction[10:8];
% W* p9 s; \3 ?* p                                                rab<=instruction[7:5];
0 b# E/ {: c- t) ^9 b7 G, V7 y                                                wa<=instruction[10:8];; f; m. p) s8 R; j1 ], `; y
                                                insel<=1;, B) T% U! I+ z
                                                opalu<=5;
* ?6 e' u. F) ]+ l# q2 B                                                we<=1;) G( ]6 V6 ?8 ]/ J7 Y+ t
                                        end; C. J7 t; Y+ F# j* u) z: X
                                        & h9 A) \8 q1 D5 ~5 H: O$ U: H
                        sub:        begin
' w1 U9 o6 p" L2 H9 q5 y                                                raa<=instruction[10:8];7 n  x8 Z" _2 i* A& x6 E. g" P
                                                rab<=instruction[7:5];
7 M9 G4 c, \' i( t. k( P                                                wa<=instruction[10:8];) k1 ?9 [& b1 A5 ~! Y4 K
                                                insel<=1;/ r* e1 u$ W1 B( u1 g
                                                opalu<=6;
* n$ A  n+ k7 R# B( G; b# f8 s                                                we<=1;2 \: c  }% i9 c& a; f8 e! H% O
                                        end0 l! k3 B2 |& L/ }3 v( o1 ~  Z0 D
                                       
# ~# l( U- q8 z6 z( i                        andi:        begin1 L' q/ w3 x, f" m' e. g5 L
                                                raa<=instruction[10:8];
7 [  I7 w: ^. U: |5 s3 d! p, C                                                rab<=instruction[7:5];
3 f4 u) U0 u$ `5 W# c' a$ u                                                wa<=instruction[10:8];
- L. e8 I7 |5 m& G% r" S) D                                                insel<=1;( t% w6 h! h0 G' x
                                                opalu<=1;& s. n3 S# U- V! X# P0 i* \
                                                we<=1;' i8 W% \" N' P4 ]
                                        end4 J) U: d' C( T$ A
                                       
6 o8 p: A# k7 t4 ~                        oor:        begin4 t4 Q+ X7 w0 \
                                                raa<=instruction[10:8];9 ?) c2 T7 a' R, f7 ]0 ~5 T3 v
                                                rab<=instruction[7:5];% T! {1 L/ x" x- N* q% S
                                                wa<=instruction[10:8];
; v7 @1 @$ |! m* P; c; f- I                                                insel<=1;
  ?' A% e) F3 k                                                opalu<=3;7 m! [# t; G- {/ X. X# L
                                                we<=1;
) S6 W2 z+ \3 y4 V' N" P# H! k                                        end
9 P; S; C  P3 v" T+ y2 e' _                                        ' [1 x5 [* |2 v  O! ^
                        xori:        begin
6 x, @# ~6 G- I' m: B                                                raa<=instruction[10:8];
' @2 ]' o( @6 J, d* M" q; d; q                                                rab<=instruction[7:5];
( N  o$ p7 Y+ w6 V                                                wa<=instruction[10:8];
2 H; v. Q2 W& y5 t" |# y                                                insel<=1;$ e0 w- ?7 C  A4 y7 H& \# D
                                                opalu<=2;" D: J7 k2 C% @2 M9 d& o% I) m
                                                we<=1;
- F1 A& j: s7 a! k& X  p& I                                        end7 B) M' I7 J  c- h- N0 @7 Q
                                       
# Z1 X, }  ~( \, v2 k                        jmp:        begin  _3 e7 C$ L! f6 P! S1 q
                                                naddress<=instruction[10:0];7 r0 E; V$ a) X. I/ ?
                                                selpc<=1;
8 {: o/ k; A9 q                                                ldpc<=1;, J0 Y, v$ r$ _% i! f) _
                                        end
. m9 m; ?$ e: W5 u# F( q9 X2 c                                        2 S9 p/ K8 ?# ?
                        jpz:                if (z)# x: ^8 Q% V# {' a! k
                                                begin
; ~; P$ z0 |5 t. M                                                        naddress<=instruction[10:0];; E% p1 W' t' C
                                                        selpc<=1;
; W  g1 ]8 S8 R5 s# \1 |                                                        ldpc<=1;# S) x# ^9 ~3 j5 a# v
                                                end
* h+ B, |7 a  ^& @' N' C: l                                                                                ' j4 O5 c. D- z- x8 ]1 K! a7 s+ r  l
                        jnz:                if (!z)
5 D! f, Z4 J8 l: q                                                        begin3 z' E( ~; q) `' r! t; x0 x; r
                                                                naddress<=instruction[10:0];
. H# r$ C( A+ {% r8 o2 }                                                                selpc<=1;2 h9 D" S- h/ P
                                                                ldpc<=1;$ N4 u; K  w$ y, M
                                                        end. f4 \: d: V* a2 F( y; z; u, z
                                               
$ p# I- j% D$ E6 \# J3 x                                        . L7 o! }. O0 N; T) h2 x* v
                        jpc:        if (c)5 D0 d" V- q! e0 v
                                                        begin+ O, _. X2 M2 h- H
                                                                naddress<=instruction[10:0];; x: K$ A* c! h. L0 p) D% k: Q5 P0 X$ L
                                                                selpc<=1;
8 E6 O, f, V. p                                                                ldpc<=1;) l5 C) f+ I5 `: I' v" O8 K; _
                                                        end
: `' y( K  Z, y/ {8 x) G- |                                               
4 O" k5 j6 U: z2 P( J, a9 N                                       
, q! H! C$ t) d3 F* Y4 Q                        jnc:        if (!c)
: N: o+ G1 {$ f' w* H. n- r0 Z9 j                                                        begin
  i8 x: N- ]/ D. @8 }0 u                                                                naddress<=instruction[10:0];7 ]/ k, O4 O* u  N
                                                                selpc<=1;1 V1 w- A, B, O, V- }& J, W0 j
                                                                ldpc<=1;; H' m3 s0 s, @4 E+ J
                                                        end
4 W9 @+ L1 R8 G$ ?+ Q3 u$ n                                                        / O' y  [* ]; i1 H. x: E
                        csr:        begin
: C1 S) m, O& m% ?( B4 `6 j                                                naddress<=instruction[10:0];
$ r! h! S! }9 z                                                selpc<=1;+ t/ _* e; |9 i
                                                ldpc<=1;  Z. U- ~+ @  S, r1 c& g
                                                wr_en<=1;
4 [1 K  p$ _3 e3 H) V' A% w0 ?                                        end
  j+ X+ ]7 }" }/ w                                        , k& ]& F7 h6 n  C, K5 ?* I# T" D
                        ret:        begin
. {5 ^3 Z# P  b2 U* V2 N; q                                                naddress<=stack_addr;
& V3 f& Y7 O* t& L  o$ K9 N6 b                                                selpc<=1;' T0 d, O9 x7 i& r
                                                ldpc<=1;
% @6 W8 z  h; _3 w7 o% e                                        end
+ E% M0 S" j- `2 M. J% z                                          ^, W; q% c3 m8 p8 Y
                        adi:        begin3 k+ u/ w. _6 h+ k- r3 W
                                                raa<=instruction[10:8];' S! m* E' m; M8 {# I8 K. y  a! t
                                                wa<=instruction[10:8];
/ {+ b6 d% _$ v' f& t                                                imm<=instruction[7:0];! {7 v- w/ |5 [% e9 X. M. d
                                                selimm<=1;* F2 }& a$ O+ l6 s
                                                insel<=1;
0 P3 f& f4 A/ l                                                opalu<=5;% r# s0 r+ [+ c! {
                                                we<=1;+ D1 ~/ m- H) T6 n7 v
                                        end        3 v$ S! C' F* e% N; R8 c
                                       
/ m( d* l/ E" y                        csz:        if (z)
4 B( J" D3 [  P# l* C                                                begin4 c! \5 z# v2 V* ?5 ]$ O$ ]
                                                        naddress<=instruction[10:0];
! e% _& I9 n; E0 r& K                                                        selpc<=1;' L' }1 S2 j% f  w" k( M2 n
                                                        ldpc<=1;  q$ W1 T; K5 y# O
                                                        wr_en<=1;% W- l% s; ^2 C& c0 D# a  I8 @
                                                end
6 G! d1 Q1 u' g8 L8 E                                                0 C$ m9 l( A* j2 i! u. m
                        cnz:        if (!z)
  p( m/ I$ i) b                                                begin
4 F/ Z7 x& u# _& A* N& f3 h                                                        naddress<=instruction[10:0];3 ~# l0 N: b  w' Z
                                                        selpc<=1;
& t  o4 k. {1 E' ]8 a& B! s& x                                                        ldpc<=1;( x7 B: j8 U9 y; j
                                                        wr_en<=1;0 i( m9 I: f  Y
                                                end
6 D# C' M7 U* K7 j  N& _- q' C$ Q                                               
. n% A; F" E" W5 c! ]                        csc:        if (c)9 s* a) h9 O, U8 Z
                                                begin
- W2 x, o- v2 W* z! ^( _. \                                                        naddress<=instruction[10:0];
0 _, j2 o6 x1 |% @8 D9 |, H3 l                                                        selpc<=1;
( R* ^& W4 }( f. O! [( y+ R                                                        ldpc<=1;
' \$ U0 ^  S( S' z1 V                                                        wr_en<=1;
' i& I, w7 X0 ?( [' Y5 w5 k" E5 l                                                end* ~9 a' G1 r. G: W6 j% y" \
                                               
7 P- ~( }4 L& p* j0 \/ m                        cnc:        if (!c)
8 X) R- i. h4 J- Y$ N2 M" k# q1 \5 \                                                begin+ C' S+ s( g" z" q' K
                                                        naddress<=instruction[10:0];
: ]/ C9 q% i  i3 O' u6 K, R# ~. H                                                        selpc<=1;" ]) S0 U8 _& P
                                                        ldpc<=1;1 o. k$ |" ^- K. t( H
                                                        wr_en<=1;
3 \* c; J, {7 R# O2 Y! L$ G3 j                                                end
& m" I( B- }% L1 @$ I, W                       
1 D7 [  K. t: \; g( ?                        sl0:        begin       
( c( S+ R, O, u  }4 h                                                raa<=instruction[10:8];7 \8 @, }- P9 [
                                                wa<=instruction[10:8];& i, `) q1 J7 b8 h: U
                                                insel<=1;. w7 c! r/ |+ w) p( d4 w
                                                sh<=0;* ^8 c7 {8 Y$ b8 H  h
                                                we<=1;
! [  ?; n) O) i. B; S7 l1 T                                        end
* a% V4 C3 N5 [4 G. ?, \4 `( Z& p                                        : N, T" I) I9 N- W& |
                        sl1:        begin       
2 [. v" s7 W0 i3 U% F9 t$ u                                                raa<=instruction[10:8];2 ?. C) [) S# M
                                                wa<=instruction[10:8];
! R& l" d5 e. s8 x* U# ]* w  [                                                insel<=1;
+ W+ M% @& I1 A4 Y& d                                                sh<=5;0 p3 J" @2 ]" ~6 _- e4 o
                                                we<=1;
" a3 ?5 f/ I& p+ S* @+ h                                        end  S7 A1 p( U5 R' M' h$ V
                                        ) _# h1 H7 h4 z" ?( n
                        sr0:        begin       
+ {) X. J& d2 a( M) z0 H$ `6 ?                                                raa<=instruction[10:8];- I  r0 P; j# D& G9 }
                                                wa<=instruction[10:8];9 v% f/ Z+ {( k9 A' S* e7 w
                                                insel<=1;
8 j& s2 C& U" \                                                sh<=2;
3 ?3 G( D5 `  B: }  m/ D                                                we<=1;
  C( R( S/ K0 \+ j! x                                        end2 h4 M* e( ?- z2 O
                                        3 Q% z, D  N7 |4 k5 e3 n
                        sr1:        begin       
' @/ {9 ^8 v; `5 a" s7 }6 J1 v                                                raa<=instruction[10:8];
/ \8 I8 q5 x$ O5 K                                                wa<=instruction[10:8];' Y2 `$ Q: [; I" `/ F1 R+ y
                                                insel<=1;
2 U+ d( O1 S% b( E                                                sh<=6;
; H7 S" f9 }: D/ Z                                                we<=1;
: s. X6 K* k, y3 h0 E# Y                                        end        $ M. f9 ?' d+ I' D; A

' X; y* E4 {& q! V9 J                        rrl:        begin        + C  R3 ~% H* m$ y3 v' F3 u/ |
                                                raa<=instruction[10:8];' J- ?0 X2 \: J* M( \0 e
                                                wa<=instruction[10:8];* s3 n# p; b) @! {! o& X8 ?
                                                insel<=1;
" R- T+ g7 P. `7 K  k                                                sh<=1;
) `% M; j  C  B6 `% T6 Z# ?                                                we<=1;: f, o$ {# L1 J  K1 [1 c; P
                                        end                                               
5 ?$ b2 Q8 G5 d                                        ) j. s) b2 k5 Z
                        rrr:        begin       
- q9 ^5 z) T; [; l                                                raa<=instruction[10:8];  k3 N, k  E' ]" ^+ H- z
                                                wa<=instruction[10:8];
: y; Z0 Y/ s0 T  F- W                                                insel<=1;
% _$ h$ G# G$ Y' A' i7 f                                                sh<=3;
. S  l  K  O2 n  D) F                                                we<=1;
3 h  @  g% @* z+ T                                        end
  }9 J) c+ s" B; ?                                        . ^; V# x2 w5 i
                        noti:        begin" S2 C! I# q( b1 n$ D
                                                raa<=instruction[10:8];
* q. Q+ \2 w5 ^( V4 ~( }) p6 c9 X                                                wa<=instruction[10:8];3 ]6 t( V/ p% T
                                                insel<=1;
( u. q$ Z' Q# T, I7 I& t                                                opalu<=0;+ K  ~" y1 Y( K9 a1 x
                                                we<=1;3 `6 P: r( V4 ^1 X0 Z
                                        end
- K: B( N8 q, Q2 l% C' l ( X) x6 ]3 o$ s" Y6 s6 Z2 D9 [
                        nop:        begin
+ ~; [$ O  M- N* n1 t! t                                                opalu<=4;% H* J' `, A/ ~1 D5 M- ^
                                        end        0 i! e" r" T3 H/ k
                endcase
7 K1 E$ l2 B  s  `$ x5 ^end
+ S; J/ n$ n$ P: ^3 |2 L , O7 l, |+ S+ h( W& T
5 h' v9 z3 o* C9 T
endmodule
6 n, ^# s/ S( j# [% M; W. C
- Y5 e: a! [" X! {2 s
& b' D5 q& e9 q7>数据通路:data_path
& C8 _" R# A) @  e, m- n. _& Q3 z9 B4 k0 f/ d3 _

1 ~7 {( i9 f4 \1 M2 j, }% e; K8 z2 c* [) m  a, s4 w4 ~
/*
: X' f" V, F3 u/ ]*
6 L0 c. p. P. Y& U$ B* file name        : data_path.v4 Y! v6 P& p" ~/ j
* author        : Rill# a9 k: R. G# ?8 q+ x% \5 H, W, H
* date                : 2013-08-11% S! B- ^2 f) Y6 S
*
' Q6 y2 h& l$ L, G( `& I* Y*/
5 w$ {) w- D2 m & ]! q7 K- o# Q- l1 G4 T

$ [' D4 y* s" P; Z* j 1 C! A; H8 T) Q
module data_path
& b# P# q& q- Q7 V. v7 Y(
3 c- W% C7 t% I+ k; A    input clk,
1 h2 o7 T; G* _* m: k( ]8 P    input rst,- J" d% ^  P; u; ^/ c  }$ |) [6 \0 Q
    input [7:0] data_in,) t& p, Q; `7 }( D* w* q" Y  U
    input insel,' ~4 I2 d, g: @% o( L8 ?
    input we,
: L6 n! V. f8 }2 [$ `    input [2:0] raa,
3 q4 A5 ~6 i2 q/ r    input [2:0] rab,  ~5 U) O( y0 y! X$ W
    input [2:0] wa,
3 B7 k) r" j$ H, Y9 G) K    input [2:0] opalu,
. {: f# U2 ]& {9 F7 r) J    input [2:0] sh,2 o! k: J0 W6 e# L! Y; U& Y
    input selpc,
% _! q. {/ g& w4 l# x" ]" p        input selk,
# ?0 h: _* n- [9 c5 T. u& N3 M    input ldpc,
4 H1 {" M! w3 }" L        input ldflag,* F: A% Q6 B4 ^: o
        input wr_en, rd_en,9 |% j7 X5 `+ \7 r0 R
        input [10:0] ninst_addr,
5 Q& I; f$ V6 ?8 w. A- f- [0 T        input [7:0] kte,
' O3 F0 e4 i) A5 p, H        input [7:0] imm,
' Y; n8 I8 ?) F. T( z8 F* A        input selimm,+ Y9 i: J6 _( Y+ Z
    output [7:0] data_out,2 t; l# p0 e, a. y, ^% N; b
    output [10:0] inst_addr,
2 I% t8 B( d* @4 }; t        output [10:0] stack_addr,
8 Y7 r# I5 ?9 \& b, b* o% ^        output  z,c& o3 |( b5 z4 B, e# e" F" S3 n9 }
);7 J: P! o7 `* L: d" X

4 W5 w9 b( C- x+ S0 lwire [7:0] regmux, muximm;' g/ L; C* H7 s9 i% z. l2 v( w5 e, E
wire [7:0] portA, portB;
+ x1 Z% c7 A0 c  O# {5 g& w: x . r  k$ Q! R( ]
wire [7:0] shiftout;; m# ]$ \4 a4 [" g* V& @/ V+ x

% u8 x+ A8 m# j: |7 b8 L0 dassign data_out=shiftout;# ^3 t: ]0 I0 A. y. v1 K# E# n

) f6 r- ]& r* L4 e9 L
. P7 ~5 g" j( c1 q) ?. ?2 }" ]genpc genpc8 i5 t/ V# {& o. h/ i: Z
($ ]* w, O# D; J9 o" L  D
.clk (clk),4 `6 L3 b, J/ [. u/ e
.rst (rst),$ b; q9 d5 E& Y0 ?/ z* U" K

: J7 F" i& q8 F) c1 ?  z.ldpc (ldpc),
  t" b, T. }) Y1 m, L$ X9 j.selpc (selpc),; G6 {( e$ \5 m9 F! i
.ninst_addr (ninst_addr),- {% }& T# R: o$ V5 z
& W% N; N2 H( v
.inst_addr (inst_addr)! ]$ V" e0 x3 l1 E0 N3 m1 e
);
6 k$ K, y$ k# z( N3 @$ i) |
3 ?0 g$ J3 F" q. e5 r! F
& n- X: p! T# t7 Qalu_mux alu_mux# {, r$ `% n5 P1 g. C& }: Y
(
' J3 x: r6 }% v6 \/ R+ d.selimm (selimm),
, [0 T* s1 ~8 Y1 v( ?! }.imm (imm),7 W7 N4 v7 R; i6 B
.portB (portB),
& ~! t$ m( w3 W3 H, z   O9 l2 `- I4 B$ B" G" q
.muximm (muximm)) M+ R( ?4 u& o: J  l7 e) k0 e
);
/ W, A3 a6 X8 |
) l+ r# [) J+ v0 d/ `6 balu alu! V/ K# t/ b! s; Z
(
) I4 X* L2 D/ h: g* Z! {: `.a (portA),5 p! |! O. X6 F$ S3 M, ^( [6 H( h
.b (muximm),
. Q& j4 w& r2 O& W& \.opalu (opalu),
& v/ v6 k" s; I' P" @- Q.ldflag (ldflag),
' F) y1 |! f) R- l+ N6 M.zero (z),
) p' r/ \' Q' ]! Q! S3 I$ Q.carry (c),- ^" K) [: U+ t4 Q+ @9 Q
.sh (sh),
8 r3 g# V: n3 H& Z# U2 k+ b.dshift (shiftout)0 y- \# W/ a; u$ e6 B5 O
);
) w0 b: H+ g( ]6 }  t ' @" S- h( J2 B7 Q! h

! a9 j+ `3 a* s$ u& }stack stack
* y4 ]# ?9 h* b! J(
- B3 l: b5 p) b+ h.clk (clk),
" b' T- B( a% H- G  v( Y.rst (rst),: S' G  D( Q3 d7 W
.wr_en (wr_en),2 Q, b2 S2 }8 E  \( h7 c
.rd_en (rd_en),
6 R* ]+ s% Z1 X8 C3 T.din (inst_addr),9 v3 o( r' J* \& @- G5 S# }4 D7 j! b
.dout (stack_addr)
! i; t6 U: e5 B0 o8 B+ p# {);
1 C% p# J& f$ W# b. z9 O$ t( m3 F7 L! L# P7 q
% }8 n3 e% ~) @: t/ _) b8 }
; K! ?3 O, Z. c9 y. P% J0 Hregfile_mux regfile_mux
" v' u& K8 r; P, r(4 j' ?( `4 ~* t, w
.insel (insel),
. |0 a# r9 |( ]7 [* d. \4 _" ?.selk (selk),: W/ k2 L0 s% R0 s; O& p+ f
.shiftout (shiftout),
! l* r+ U5 {) T( T: U.kte (kte),
5 j& u/ T5 S$ ?! j.data_in (data_in),5 x0 r% ~  R* h; p# J  p

& z- L8 A6 K; N! @.regmux (regmux)
3 |: z! [, y# l0 G8 m7 y);
  N" u% r7 J$ r% ?* w- G 7 |. t7 @. E& X7 N2 M3 s! N
regfile regfile
% ?/ S9 u) ~& h( B8 B0 ?* ^(
2 @! k  r# r* E1 I9 V" Q.datain (regmux),
* H4 y( X+ [) p$ d, I.clk (clk),; S+ ]9 v- z* ]3 L3 {3 r
.we (we),) x% ]  M6 [8 A# p1 ]+ s
.wa (wa),. K( ]! C, M! `4 N5 ]5 E9 H! |
.raa (raa),! f! O! _. c. N7 d- b5 U
.rab (rab),
" s* G6 e. l6 [3 K1 V.porta (portA)," y' R6 K' K; A0 g/ T7 I4 ?% L3 v
.portb (portB)' p# R  y- c* ~: z
);1 o& d- U- p4 W% k7 {) x" U8 v

( |% m: O+ p4 a( W 7 Y- H8 H3 P+ G& L* I' `
1 A7 M! I5 q+ k( j8 P$ I/ L% E
endmodule0 v- C) ?9 M+ y
. [+ b! K- ~5 @, ~6 N4 Y

3 V4 K' z3 a- B% `8>程序计算器:genpc
3 H. U# z' j6 o2 ?$ l; a
, N# O! H6 W5 V& p4 O7 U
8 X2 g' k: L9 E, I+ l8 `1 x* ^+ {( ^$ O
0 }. `% \7 @1 s, U/*
2 K9 X7 K/ ?  O7 ?2 }# m& d* k*
5 K# ~- y5 y  m# h" t7 q* file name        : genpc.v
) X% ?1 v% R& A+ p* author        : Rill8 j0 \/ F9 T' T+ ]; Y3 v
* date                : 2013-08-11# n0 l5 a  q6 H% _
*
) G, y9 N; X9 }8 ~* A7 ]*/9 I- g& M! K) @

% O* Y% J/ b! }6 W# }/ A`define boot_addr 0     //boot address after power on
; n/ a6 t( F2 j+ U; a0 @3 T 2 i/ }  ]) n% n9 K1 N7 g4 {
module genpc9 X- |" O5 V7 v. e: E
(3 S: K. l1 c4 H2 Z+ \1 B: T
input clk,
4 q9 e2 i2 ]' m4 G/ Zinput rst,
& y; z7 D8 J7 l/ H5 t4 n1 u3 S / F9 {$ `# q9 l
input ldpc,
$ R( s) r: w4 C& d/ Qinput selpc,$ A5 i, [8 X" s" \3 G! v- r% l% f
input [10:0] ninst_addr,0 Z' I" \( p  x, [3 R
% C7 `3 r6 Q$ ?8 ^
output [10:0] inst_addr* K1 D5 ^; `8 j8 b* N
);8 Y. M# c2 b5 X+ u6 u% B+ z

- U' d, a. L! g, Kreg [10:0] pc;$ u' ~5 W: D0 l- l( E7 C- h3 m/ }
# ~" J0 R: ?* x& w; Y- K
assign inst_addr=pc;2 D+ X) ^- p/ t0 s! f" @" b
( o( N1 S  E1 }' C) F
always@(posedge clk or posedge rst)" I. u' _+ J$ _8 y  f4 X7 Q: V
begin
! J( K" ~0 g2 c; f1 K7 E5 `        if (rst)$ ^* {- i: g' I# M) L8 h# y, F
                pc <=`boot_addr;$ Q; S/ F5 j- b2 O% P
        else4 j, i: k& k0 c8 _
                if (ldpc)       
5 d: X6 ^6 {4 P8 H7 P3 D; d                        if(selpc)8 o8 c" f9 l1 }6 v0 E9 D
                                pc<=ninst_addr;
4 r2 l1 O# g" ^: U9 p& G, S6 ~                        else
( @" F; D7 @. ]. W- W                                pc<=pc+1;- D; J, l( k7 K7 ~$ [* {
end) F) Z& |+ N! [% ?4 A
* d: W2 V6 l5 G% W

; J, Y: J; a5 q- ^endmodule7 J5 J% h; R' ]( q0 f6 p
- x( k8 f2 q# _
/ L& F& L$ P) J2 S1 I& @

" Z* a: c, ?2 B$ v; a: v  S; y& p8 g% F5 v  y: ?
9>运算单元:alu ,alu_mux
9 Y4 h0 F& E+ o: |6 W+ b: q- O4 M3 F+ |; w

1 P' I* ?* z# g& I: t/*
4 g+ p) C! X* S9 G( Z" Y7 z*# U* o+ o5 F% U& B+ G
* file name        : alu_mux.v
. e4 {0 l3 j! `7 c" J6 y* author        : Rill5 h+ E6 L- ?2 Q
* date                : 2013-08-11
7 o4 D) N; L; f4 V( B5 ~: l' E*+ x( M, b% o( i% _, v4 h
*/
; v  L5 i; G0 A7 i
. P" q' s  k  |
' [1 t) E1 E+ Y0 S6 b
( W, D5 j5 C+ E& A2 `3 y- }module alu_mux, c+ r0 l) ]+ t4 L& b8 Z
(
- _/ h# c4 ]8 X" S0 Minput selimm,
9 d  Q( I, q' P4 |" C' E& a: j) S+ Ninput [7:0] imm,$ s  \2 ^" _. P2 ?$ I
input [7:0] portB,
4 g: E% _/ [1 A0 O1 o - k8 d0 B6 |& x. U! c
output [7:0] muximm
7 K+ i2 _6 ]' T+ W+ J6 ?);
7 e0 [. l2 V* i
* G6 s) I4 m% C- I# zassign muximm = selimm? imm : portB;//result : imm if ldi insn,portb if ldm insn/ L- Q# S6 H0 T8 N

. q: j. D# z- l9 _ , c/ m( N& q3 e; n4 c; U# Y
endmodule- Z' x( x: G. W. u/ j. w* r
, F' E$ U; H, ~, U7 s
7 d0 j) q/ d( m0 z# v5 S
/*
8 v) l5 g  w" J) e' i9 f*
, R/ T/ o0 z5 d( y( L* file name        : alu.v
3 o1 x0 F/ _, n( r0 W9 n: ]* author        : Rill
; H, h# k1 t; }! Q  D$ L* date                : 2013-08-11
7 M/ ~2 G- b4 j9 S4 r. r*
4 P1 p* D7 X! W/ s*/( h: L$ m+ I2 z! t

- T# R) j& }& o" \6 N- t 9 O5 j, ]6 E- J: p+ A" m8 }
* ?$ i% p6 A2 ]4 q$ j
module alu8 s9 q! h9 O" ~+ Y1 M, i
(
% c6 y9 v; K0 G& m. Linput [7:0] a,
4 f  W% d9 P! R( W1 G" |input [7:0] b,
. w# h! q0 Z! t2 H/ X* m4 u( p0 uinput [2:0] opalu,
8 V  c6 Z( @8 Qinput ldflag,/ ^- b7 f' |5 N# ]1 b
output zero,1 b2 w& h; ?& }& f% `  G
output carry,  x; c0 b) l* e# _3 k3 g  j8 x
input [2:0] sh,) L! q) k$ ^# h: @* \
output reg [7:0] dshift1 F& m; C$ [" F# d! b  z
);& ~! ^' u2 h9 b! l* O  G* B& E
5 K5 m( U: x5 S( D
reg [7:0] resu;, k3 r4 c" T6 b) v; Z

* M- w' I8 X+ R/ b* h+ L% kassign zero=ldflag?(resu==0):1'b0;0 G6 [& H( b$ E8 N$ @$ p

3 S* Q5 b( t- }2 p! @, g6 e! H8 Hassign carry=ldflag?(a<b):1'b0;! T  X: [5 {2 L7 j; @! k

- M4 r# b( a. f& ?2 @% m6 oalways@(*)
8 a6 I$ B" a  t6 H' A) O  _& V        case (opalu)
- m2 e) _$ f1 q# q5 r" R                0: resu <= ~a;
* L% l# d. t5 x- Z                1: resu <= a & b;
. K: }" O# ~$ f6 B, l3 r                2: resu <= a ^ b;
/ I; P$ K( B( c8 ^7 k                3: resu <= a | b;+ T; k+ N! d0 O; m
                4: resu <= a;" Z+ {4 n3 X. Q0 b- d! ~* ^
                5: resu <= a + b;
" Z' a+ I* v# _                6: resu <= a - b;. {- H6 L; p/ q4 ^% J* |8 O. i; Y& i
                default: resu <= a + 1;! O+ }5 i/ K- N/ i% t; W
        endcase
: I2 f1 r0 d$ R) j, N        7 n+ ?" e1 O: s1 |# o% |# \
        2 y' H0 ?$ }/ i+ F
always@*
! ^$ Y: E0 m$ ^6 `                case (sh)3 W7 z* k% H# y% O* I
                        0: dshift <= {resu[6:0], 1'b0};* I: y( _3 W2 N' L8 h
                        1: dshift <= {resu[6:0], resu[7]};
: D" T$ `; N% @( ~2 y+ _- P                        2: dshift <= {1'b0, resu[7:1]};
$ @" t9 X: j4 T, u, P' j6 p                        3: dshift <= {resu[0], resu[7:1]};
- M1 z5 D7 ?1 @* G9 i                        4: dshift <= resu;3 _7 e4 w, \5 p  e; B0 n
                        5: dshift <= {resu[6:0], 1'b1};
! G. e, \/ ^$ R9 A3 [- V% ]* Z                        6: dshift <= {1'b1, resu[7:1]};' R8 q' R1 r* l# n
                        default: dshift <= resu;3 o, N% }4 @: B7 m+ [
                endcase4 z8 H9 C- X' K) x$ k
/ a! q% b, [: R" a/ l  V2 m7 P! h
endmodule, P( L; O" }+ O# j% m
8 Y; o8 H+ R. m+ _: Q
" E: r6 e* u% d+ }3 q) ?
10>寄存器堆:regfile,regfile_mux' _$ ]% ]* v; z/ o

' Q% }' L- p' J7 I% x8 a( E5 B# I3 Q4 s8 v

) o$ t" k7 N: g- I7 b+ ?/*8 X3 H+ n4 k; M  Y* c$ c
*
: S9 Y! o* \1 C& [+ }; H% \* file name        : regfile_mux.v
/ F4 I/ z/ J  J" G4 t& [4 ~9 D. C* H* author        : Rill# e' s4 s+ ~4 K2 M! n
* date                : 2013-08-112 u. q: g: {1 J4 i
*
/ G$ z; p( b- M; X% w*/5 E# t: h* t0 K  _! r- W

+ }  R: \( ]' L. d
8 i- @/ i7 B% Z2 y , A" E5 e3 y: ~, y" c( _' s2 R
module regfile_mux
. k' O7 n. K* [# C" G(; P6 n# m" p+ \. `1 I- O. ]( x$ x2 E
input insel,
7 }: t, `/ V+ V. m7 D' E2 Vinput selk,
8 S. `; G  s( `+ ^1 G5 Binput [7:0] shiftout,
* `5 Y+ Q# B/ D! [input [7:0] kte,
! ^1 f" X/ H# p1 J5 Z8 einput [7:0] data_in,+ z: `  c$ O2 ?1 Q. l
8 C) z9 v7 r* {) X3 O
output [7:0] regmux: `: f. k% ?9 V) f
);* R% y) X7 S* K( f4 c# W

9 b# O, k7 I/ U* P$ y0 Cwire [7:0] muxkte;
6 r( U& q4 Z) G0 X2 H 8 h% }' ~# X& n) L: ~
assign regmux=insel? shiftout : muxkte;, G$ ^5 @2 ^: T$ _+ s: B
assign muxkte=selk? kte : data_in;2 q& g% P) H! y0 E" F

2 p" k  W2 V$ y2 D+ s; Z% }
) X7 d; h; x8 K0 w- v4 rendmodule
8 J' H6 Y# W& K
' z2 T) P( A) T8 Y% k) H0 z3 e3 Y# s: n( D% M
/*
% I1 V* P! Y$ h: C*
- [1 Z- V9 ?( A4 ~* d3 J- Z4 s* file name        : regfile.v
0 m  L  B( H5 S! t8 l& _5 M* author        : Rill
" b: o2 h6 B% Z4 i$ k( @! p6 W" S* date                : 2013-08-11
: r0 Y: u0 E3 ]3 }. B$ n" u*6 i. Z, J9 x- i( k$ s
*/
+ h& N" S3 L, K2 \3 _, s3 r
) a9 w, T4 c) ~) H' Y 9 ?" W9 b) H9 r; A, Q: C8 Q; J
" j9 X6 m/ l& E0 F5 M1 {; o
module regfile(* k# H8 I: D9 L" ^. l
    input [7:0] datain,- f- R) _5 u2 X0 x5 W
    input clk, we,
6 k# B  f1 v0 X8 W! b1 Q    input [2:0] wa,
( y8 _8 h3 ~" s7 b) w; [! X; v: R    input [2:0] raa,
- p- O& `: L& b- D    input [2:0] rab,& X. m+ J. M8 |/ J
    output [7:0] porta,
- W7 k0 u6 u2 O5 @    output [7:0] portb
* t- @  Q. u3 p5 `" U    );
8 F, J* U" I' L( m
% P& y! q7 l  _0 p! D) K
+ c" E$ d$ t( X- ireg [7:0] mem [7:0];//r0 ~r255
/ f. X, _$ f% C+ { " p! N0 u% C- ?  F6 G
always@(posedge clk)- f8 j0 y% E0 W! ~+ B$ T; H8 n
begin
+ P1 {: U/ N% T/ G: ]        mem[0]<=0;//r0 always is 04 Z/ q! n! U  L8 E( i4 k2 w' x! o, `
                  _! d& T. M% u' b" r
        if(we)" Z! O) B" L- M* Z! L- G* u0 {8 |
                mem[wa]<=datain;
' w. o6 t: J- zend        + ^( l+ x( F, t. o  w) X/ p, `& L* m
        6 o9 i1 b! u2 D2 U* u
assign porta=mem[raa];, C. q/ D# y5 p6 e7 E0 c9 y  p
assign portb=mem[rab];
( K5 P# ^4 z8 e% q / ^; @. I" h) {! Y3 B

1 @, K( R4 E- t5 eendmodule
! B; u' f% D) ?; j- h; n
2 b; x" j* G( T0 Z4 n0 F- t7 g% S$ R2 u3 Z# |8 e1 R- ~* ?
11>栈:stack
& z+ J9 O- j$ E1 }0 I- w
* p/ n+ I* p$ ~) _8 f6 ]: |% \! X! ]! p+ v! U4 f: ?
' d% ^6 x! y3 C  V0 v/ s
/*4 U) D1 Q  G6 ?% ^* d
*+ ^/ ]7 F! q7 g: E* b0 R8 y! L
* file name        : stack.v
3 R7 @" N, v; x+ s* author        : Rill
: K) X% C! |4 S' ?* date                : 2013-08-11
! w4 Z- [9 s( z: x+ }' J3 t*5 k3 H2 k  y! |0 a& \
*/
0 I7 f& m4 ?5 o/ u % R3 B4 N: D" b

3 I* I# V) Y4 |% `
; r  E! j! D  g- e4 nmodule stack(
* q# P( b  q/ ^$ n( ]# P    input clk,
# H) H# F. v# z% @) k4 G( r        input rst,3 B0 B" R3 C0 l2 ~) D3 w
    input wr_en,! @' ~" H9 e; r/ ]2 ~" D1 s  _2 ~# \
    input rd_en,
/ @& W0 _* w; K8 F    input [10:0] din,
6 o5 J/ \! m$ H  w# z4 H; m    output [10:0] dout) r* O. A. F. \
    );
" o0 _# }# J8 f1 q- z * U1 A* x. Z: r: ~2 D( {7 @- B
( Y/ g6 Y$ y# Q0 t- x; e
   (* RAM_STYLE="DISTRIBUTED" *)2 q6 t3 L- v* l. b& |
reg [3:0] addr;
7 T' P5 H0 v) e; g0 mreg [10:0] ram [15:0];9 [" n) |& D% y# L. T8 s5 h$ t
( h$ }( d* o2 X
assign dout = ram[addr] +1;, i) w8 L9 r& M+ [; p1 g. Z) f) L
: t2 |9 ^% `( S5 B
always@(posedge clk)& i) N# Q8 J$ G; i) A( X; g
begin* [, Y$ z5 Y4 T- M$ i0 x& d, _
        if (rst)
( f  x+ t* J% h7 ^/ _. P                addr<=0;
, z4 u& b  H1 W; L! z" W        else
3 d8 x1 V, K1 A6 `                begin " M: y: T3 }1 I! E. ^
                        if (wr_en==0 && rd_en==1)  //leer
" d# U3 ~2 m" q$ s& _                                if (addr>0)
1 V  I6 ?  n; H, j                                        addr<=addr-1;
2 C4 `, [3 ?0 L( @0 X: H$ Y                        if (wr_en==1 && rd_en==0)  //guardar
+ h; e: O& j; V6 f- m1 y( f                                if (addr<15); [9 x! `4 t3 q8 ^1 z% @/ |6 p
                                        addr<=addr+1;
7 \# G" k- U% t8 T                end
' X6 j9 U0 @& K0 b; ?2 `4 }; Send6 y3 m0 |: C, x# ?6 P5 Z
               
1 m8 c' {& H. F: Salways @(posedge clk)
, K4 V8 `% E; [1 |- _+ mbegin
: K2 c; w# y: T$ I5 c; p9 C        if (wr_en)+ d& ?6 z8 M# N* L
                ram[addr] <= din;
" K- X9 u% H7 m! Hend) s  E. Y0 \8 X5 g/ y5 E2 O! e* Q# ?

5 |5 s! _$ a8 \4 K% Z4 L9 j, d- vendmodule: ]# u, h# s7 X! b3 I; b
! o$ A1 [3 X$ k: B$ F
4 K: }: h- T* \3 C3 r+ \: o- \
5,modelsim仿真
) i3 E" v7 F4 V. R; v% }1>编写testbench
6 \9 D6 s- ^( F3 `% |  l* `: a要进行仿真,需要编写对应的testbench,由于咱们这个cpu很简单,所以测试激励也很简单,代码如下:
- W0 B# B' z8 O
- y, Z2 q4 \: w& _, x6 b7 v/ p# R0 A

% \0 ^/ D0 J) @' ^/ t/*& a& p1 w5 @3 X2 J( v
*
( O! b3 B- U' m/ l' m5 i* a* file name        : tiny_soc_tb.v
$ X# ]2 Q. B  J1 @0 z( \" ~- i* atthor        : Rill; d2 t( V" i7 a8 D  k
* date                : 2013-08-11
$ Z' P* x# [) |1 l*6 D) V, H$ D4 w! L& t. Q
*/
- x8 V- B; T9 x8 r6 G. w 2 g1 v  R. L3 o0 U! Z/ S9 u$ w
`timescale 1ns / 1ps2 E; Z- Z$ z; G$ w9 J

# ^' _  H0 Q: ~1 o: Z" Y; fmodule tiny_soc_tb;& k9 m+ m7 N3 T4 ]. T

- Z  C1 }( Q2 ^* ^  f' d: G# Q ) D9 K  {" b6 t" g, D1 o
reg clk;* t, K; C/ p' a1 q3 U" C% i  v& v: @
reg rst;" a; v2 N2 X; a! b# a4 u

- `: F& l- q& h/ j& \( [6 d " T% T5 B1 S) G- @% K& e5 w2 C0 o& O+ c0 p
always #5 clk = ~clk;
" W. s3 b$ E" J; } - H4 J! h1 y- q4 w
initial
3 D+ u% m# h: J/ Qbegin
( a. y7 x2 i6 f. A3 p) u' e. n$ A        #0 ( B7 {* G; `# @2 @3 _3 N8 ?
                clk = 0;4 W: U2 k. H# T& i- @- g  Z
                rst = 0;0 \+ y5 j/ T! p0 K
        #15 2 x2 t# o" D9 l- t. `) ^9 Y
                rst = 1;( l2 e' X- {% @2 @, f) S
        #10 0 M" K3 J7 }$ v
                rst = 0;
! a) _$ P" X8 G" J6 p  _                9 G/ J6 e4 H( x' L% p
        #1000
7 C0 u  b# N, W/ o4 s9 Y( \                $stop;6 k( U. Y8 u3 k/ L: C
end6 n, k# G( ^- j# l' O: D
  k; T5 C) y  S/ d
soc_top soc_top7 h- P: B; S$ @, S
(& x$ G  S5 I' Q& V
.clk (clk),/ s0 x& P6 r0 F
.rst (rst)
  r' a& l/ X3 ^) q);" G4 J" ?5 B% l' Q$ W
: |: q" h. D# Q2 u5 J( O5 x% L7 t
% m: W! Y' A' ^. R
endmodule& N  [* U) R" S9 Y6 }1 l+ B
2 u6 j0 `: k( Q6 A

* q. @1 m' z2 q9 m( g" B, F2>编写汇编代码及手动汇编' k. d& _6 Y3 P3 M; ?6 P
当然还要编写其汇编代码,如下:- _# T& ^% s8 ]  A& a

# f& ]6 ]+ k5 p" n, D, ^! ]0 Q

7 ]! O8 T6 p2 ^  `9 e5 S; s" R9 P0 y4 z
) ~1 ~8 L) S8 x5 m: W: }
然后我们要手动汇编成机器码,指令集都是自己定义的,所以是没有现成的compiler,只能手动汇编了,还好手动汇编要比手动反汇编轻松多了(之前,我们手动反汇编过OpenRISC的启动代码)。
  _2 b0 D1 |/ k  V% F7 h2 |7 k9 ?8 z- U
汇编完成后,我们将机器码放到指令存储器里,如下,共七条指令。
+ r% U- x& K* y8 z* I! T6 ^" J/ G/ X+ d! V" }- c1 v2 E
  ^  r' n( c; g$ A; R# Y: b" m2 Q# W$ B
$ u  T$ c/ O. ?' h( k# h
# S' k- ~/ P) z2 ^3 S

7 V5 ~3 h0 M  y3 X, M1 D# j$ c$ j8 \" u, ]0 I# }
3>仿真结果
( _# p3 B+ H6 }7 l完成上面的工作之后,我们就可以用仿真工具进行仿真了,下面是我用modelsim仿真的结果。
8 W6 M5 Z' z: R* M+ w" W/ X9 o' J6 A1 D
从波形可以清晰的看出七条指令的执行过程。在运算完成后拉高write_e信号并将1+2的运算结果3写到了ram地址是55(0x37)的地方。
( \8 [# J1 g/ k5 h( {
( T( x. [7 @+ i4 o. L

6 `# y( n) p; G9 p. r% ]0 m+ [6 u7 z- Y6 {: w6 L* @0 |" O

: v" q7 n* z8 |& I/ [7 q
! _, H5 r: O- q4 k7 T
' L* m9 j% N( l0 ?% j5 H3 e$ u& |; u7 e4>代码仿真覆盖率) W3 A3 ?$ Y) `4 ^
由于这个测试汇编代码很短,我们有必要了解一下这个仿真激励运行过程中到底测试了多少代码,下面是code coverage报告截图。& G( _+ I/ `6 |! C8 U7 W9 e
) C/ M3 i: V; n7 B7 q

7 Q# [! K8 r! K0 Z需要说明的是上面的截图并不完整,下面是完整的代码覆盖率报告。
% U4 O9 E) f  s8 P( |
  r3 u+ P, @0 \( x* `1 \$ o+ H" j5 T4 h+ r# c2 ~
( F) Q+ v6 U0 O8 l$ \9 `+ c9 E
Coverage Report Summary Data by file$ C( j, u' j# U% u! i! d& o
$ E! @' ~+ g1 D( E/ n
File: E:/work/tiny_soc/bench/tiny_soc_tb.v
. y! t& \+ m0 q. R5 u! A    Enabled Coverage        Active      Hits % Covered
. V, ?$ T' H& M3 O# L( o+ p% t4 V    ----------------        ------      ---- ---------& T( r. b8 d1 L& s$ x
    Stmts                       11        11     100.0
, d# t( @/ T  t8 y5 R& B    Branches                     0         0     100.0" [1 j0 e: Y% F5 I
    Conditions                   0         0     100.0
. L. F% N  `2 v    Fec Conditions               0         0     100.0
7 R+ r- I, V- i! E5 n% M0 u    Expressions                  0         0     100.0
" v+ f, b! n% \& I/ U9 U  l    Fec Expressions              0         0     100.0
* [$ o! A! c' a3 `4 K5 { * x' d' }( `% L8 \" C! Z$ J- G
File: E:/work/tiny_soc/rtl/core/alu.v
8 N) T9 u0 T1 Q    Enabled Coverage        Active      Hits % Covered
3 C* ~# [( _8 @    ----------------        ------      ---- ---------
9 R9 Q/ \; K' p7 B& v! [    Stmts                       20         7      35.03 [8 E5 l& U$ S. a
    Branches                    16         3      18.7
; G' U# k2 r. R) ~9 M9 w3 O    Conditions                   0         0     100.08 U. v6 J* k# P. W" I) R
    Fec Conditions               0         0     100.0+ m" X6 H( B8 f5 {1 X9 m( m
    Expressions                  8         2      25.0
" k3 \* D+ Y. B. T  `) o% Q$ a    Fec Expressions              8         2      25.08 i' G0 j, |8 h$ k5 f. ~0 Y
3 _. _# M- U3 j+ V" L
File: E:/work/tiny_soc/rtl/core/alu_mux.v5 j7 ^- w1 i0 }9 B! F
    Enabled Coverage        Active      Hits % Covered( Z2 Y' O$ G  z1 N3 J( D" q3 u
    ----------------        ------      ---- ---------( m. x6 z. W, R+ [3 y
    Stmts                        1         1     100.0
5 R+ ~# q9 Q% C; u: N    Branches                     2         1      50.0
7 ?1 H7 e5 n$ O7 F    Conditions                   0         0     100.0! f# {" Q5 B: u  S( _/ H8 b
    Fec Conditions               0         0     100.0
# W0 _' Z# Q) c1 U+ s    Expressions                  0         0     100.0
* J, z$ p6 m$ ]    Fec Expressions              0         0     100.0
+ X1 O3 T. a0 X0 c7 _' w1 R  @
& c# `* O. s- h% O" X( }2 \File: E:/work/tiny_soc/rtl/core/control_path.v1 {  B5 c& j5 d0 n
    Enabled Coverage        Active      Hits % Covered
  y5 Z7 D1 E0 [4 u' t    ----------------        ------      ---- ---------% S% s% k  {# e
    Stmts                      160        48      30.0; c. ^, h# ?/ S/ G
    Branches                    60        18      30.0
0 V* h" m5 K9 J' B. E8 ~$ a    Conditions                   3         1      33.3
2 x$ D( A8 O% B) q; b& h' H5 F; E8 v    Fec Conditions               4         2      50.0
9 P$ B5 l8 e$ J. G5 O4 L/ ^    Expressions                  0         0     100.07 ^( T4 O$ g, J! R6 n1 J$ M
    Fec Expressions              0         0     100.0
! E' ^/ x9 M- H9 p" F8 n 3 Z: H2 M& t6 ^; m, M1 m4 D% {
File: E:/work/tiny_soc/rtl/core/genpc.v8 q( T( N) K6 r8 V0 t" V
    Enabled Coverage        Active      Hits % Covered
8 S$ |& V3 L; i; B: _    ----------------        ------      ---- ---------
+ D& T1 P0 J$ \# ]3 f    Stmts                        4         4     100.0
- }5 R+ b& `" C0 Y3 t; c  P6 c$ l    Branches                     6         6     100.0
% |- ~- v/ B) |2 H$ r$ Z: V  I9 d! f    Conditions                   0         0     100.0  C, Y& V  n+ r- F
    Fec Conditions               0         0     100.0
+ ]9 _; L# {6 \3 ?) Q    Expressions                  0         0     100.01 {2 D0 ]! h1 s- [
    Fec Expressions              0         0     100.0& z" l2 y3 L" c6 W: P  K$ b
2 R/ {$ S* N. g
File: E:/work/tiny_soc/rtl/core/regfile.v
9 {, x; E9 _7 d" z  H' V    Enabled Coverage        Active      Hits % Covered) K4 f6 h6 n7 c
    ----------------        ------      ---- ---------
# j, w; V: X7 j, Z- q9 _( O    Stmts                        4         4     100.0
. M' H5 h2 n* S* E    Branches                     2         2     100.0  N% T4 O2 t# D* q! G5 }
    Conditions                   0         0     100.0
4 F7 p9 S: S& ^3 O+ f; m    Fec Conditions               0         0     100.0, }* s/ w7 H! f9 k4 `; Z
    Expressions                  0         0     100.0; E) Z$ u# ^  R1 _* h- i- N
    Fec Expressions              0         0     100.0& _9 j& ^6 K( ?6 U  r! ]& H+ u

4 x% c; N& B1 a% Z. wFile: E:/work/tiny_soc/rtl/core/regfile_mux.v8 Y; `, o  ^2 X0 ^# E
    Enabled Coverage        Active      Hits % Covered
" T, \: N: h9 o1 \9 D% A) a    ----------------        ------      ---- ---------
: \+ s9 O/ X" c    Stmts                        1         1     100.0
- l8 K. |6 W9 T& d% O' h; _    Branches                     4         4     100.0
% t3 @4 t, h0 R    Conditions                   0         0     100.0
, D! h5 T1 z$ L7 Z8 c6 g" ?) N( ?    Fec Conditions               0         0     100.0
! X* A/ @+ a- B: G    Expressions                  0         0     100.0
6 I& ?% H: w! `) J    Fec Expressions              0         0     100.0
3 u0 q# R3 q6 M: b3 R; t7 H
7 x/ A5 A  n8 L  e1 m  |File: E:/work/tiny_soc/rtl/core/stack.v: O( c# S9 o5 j# h, S) c- D) F( F
    Enabled Coverage        Active      Hits % Covered3 @& J% I% G: p. M# n. B; N
    ----------------        ------      ---- ---------
  x& i+ r) h/ D! f- w/ e    Stmts                        7         4      57.1! W, A0 o/ m  o3 i5 `; Q
    Branches                    12         5      41.6
; ]; y( t) C+ W! \! ]    Conditions                   6         2      33.34 D( h: v$ e, b2 \! `9 R! T
    Fec Conditions               8         2      25.0
. }8 {6 Q/ _, O* X% a$ Q* L    Expressions                  0         0     100.0( M& H! b- K$ o6 x$ f
    Fec Expressions              0         0     100.0
1 C1 X# E9 }" @- f$ y # d2 x# H( u0 D* Y7 i: N/ s
File: E:/work/tiny_soc/rtl/insn_rom.v
6 O! ^5 _4 ?, ]7 D0 K% I  F$ \    Enabled Coverage        Active      Hits % Covered
8 U1 ~* L! ~8 }7 D" C    ----------------        ------      ---- ---------
3 {: G4 C( K' B! _    Stmts                        9         9     100.0; @# u2 |5 o0 ]6 x
    Branches                     2         2     100.0( ~# j% b1 L7 Q  c5 B1 t
    Conditions                   0         0     100.0/ [# H2 R. k, |. k* a
    Fec Conditions               0         0     100.0% _) }% H& o  @
    Expressions                  0         0     100.0
. w0 z$ r/ M! ~7 _    Fec Expressions              0         0     100.01 @3 k0 B* @- s& L) W$ {6 F5 j% ^

  L+ ?) K( m, z1 I7 {7 V9 _File: E:/work/tiny_soc/rtl/ram.v
% ^, a" Y7 n8 d# J+ I& p    Enabled Coverage        Active      Hits % Covered; C' `  M7 x( ~0 P. o& {6 \6 s
    ----------------        ------      ---- ---------
/ w0 L+ y8 I8 \- Y! B+ Z    Stmts                        9         8      88.86 X' [' i8 e' J& J. |+ \
    Branches                     6         5      83.3' D8 I# Y5 z/ i/ w9 W
    Conditions                   0         0     100.0
4 h! r+ B2 R# X/ m    Fec Conditions               0         0     100.0) B$ ]& Z3 [+ a
    Expressions                  0         0     100.0
/ Z. |1 B- T1 Y& N    Fec Expressions              0         0     100.0
, L" F; Y6 K( c; F0 z
9 s7 P" G- y2 `5 L" n1 Z* b9 t  W4 w# C, e6 W" x: |3 E- X. \) @

+ J1 {9 q8 U2 }( q- Y3 i$ g( o* L' }  e* }0 n  G
. J+ S. H! I: s" j0 m7 \

7 C* ~% |" o9 f3 l6,综合
4 R: {  b# e+ R" ]0 o4 n完成了仿真之后,我们就可以综合一下,在FPGA上验证了,下面是我用quartusII 12.0综合的结果。
  E+ R/ o/ ~) ]. c8 r
7 v. Z1 K" v& ^1 c- K3 {& X) M# Z9 w, ^
2 v: s" X, {- w& K# V, a) H7 @2 j
soc_top模块:; X( Y( O' Q+ k* i

$ M# Q( w0 o0 m+ T6 t
2 h4 |' O/ s# U: o6 h+ V# e4 z

5 h) Y* z! q$ ~# {7 q: L# s6 _7 `7 Q* L. o4 \, A
core模块:* q+ F# ~+ O3 l, _5 F3 e; g
7 j7 }! ?5 q$ h- Y
% c9 Y* [" L$ d1 K# x

- X2 Y2 i- H0 M1 L5 ?( S; _" \  Q
: Z# ~* ?& d- G, b( Hdata_path模块:* Z+ ^& ?% d; _" c# t/ C! _
3 P6 m& O) C8 l- L& T
, G: q) l6 |4 q2 i  `/ e
3 X' ?& G* N) j
8 p) j5 U. l3 }& v. N

! F& Y+ W" l+ {& E# A( [( E) m  j+ g: L9 _; B# \
7,改进及优化
5 ]+ _: n& L# D" S* W4 R咱们设计现在这个小cpu core的目的是为了学习,在于了解cpu内部的运行机制,与软件的交互过程,没有考虑性能,功耗,面积等问题。7 h8 r' e) _9 w1 `2 W4 z% f
% g4 O4 @" x2 t( C( f8 v
下面,我给出了采用五级流水的数据通路的模块划分和接口定义,如下所示,感兴趣的兄弟可以试着实现她。
7 m: v$ h! X2 P% z) A! n
* d& c7 s# v9 ^% q- k. l% |4 o
( \+ z9 [+ j9 E/ I9 T. T
& a+ ~( \" ?2 W7 u

6 {* h1 M1 s# _- g/ b% F" p0 m! `/ t5 D$ F( @5 O4 f4 K9 j
- Q0 h' l% z6 _9 P' l
8,future work) U4 @2 ]% J8 i. p
1,pipeline,将core流水化
  S4 B8 R! v, \' D$ Y3 w6 J. A" t4 p3 Q) F9 r' A' s
2,增加乘法,除法指令。咱们前面介绍过4-bit乘法器和除法器的设计:http://blog.csdn.net/rill_zhen/article/details/9700155" i9 W- {5 J$ v' `1 R) V
) E" I$ I' B0 x6 U$ j
3,fix bug) k7 X' w9 U9 R! [$ ?

+ p& ~$ K; v6 P: K# k" C* G& u4,设计tiny_core的assembler,这样就不用手动汇编了。/ @0 P$ [! ]6 B) ^7 V
  @4 f1 N5 x; ^) s: U; O  ~2 K
9,小结
: L; }* w! g; M' W本小节,我们试着设计了一个简单的cpu,并编写了可综合的外部基本模块和不可综合的测试激励模块,然后用quartusII进行了综合,最后还给出了优化后的数据通路结构。/ n$ I% q; B( g* n, Z  `1 `& b

" l/ U; i5 a# F3 G: \% h9 T我想,通过本小节的内容,应该对cpu的工作机制和软件与硬件的关系有了更深入的感觉了。
4 k- N7 Z+ c; y5 {- a$ K" G0 T% O. E9 l! l
需要说明的是,我的水平有限,再加上时间很短(两周),所以这里面肯定还有很多问题,和需要改进的地方,如果感兴趣,可以把代码down下来,先用modelsim仿真一下,然后再写个I/O controller,比如uart的控制器,挂到数据总线上,如果PC机能收到tiny_soc发出的“hello world”,那是多么令人激动的一件事情啊。" @% \$ v% V; \3 I& t
8 L0 D5 X  a# a. \. Z/ q: o! I1 Q" Y

9 ~4 c6 C. L1 J: ?7 i/ r, E0 Z/ U' V7 a. d: b. D# V
附录:tiny_core的指令集
! o' M, [  O5 u: g0 L说明:; H  z. }. `! B1 G

5 f* Y! S: D$ Y: G. }! o9 trrr:代表寄存器。
/ P1 t3 Z4 B8 v4 A8 [# T7 a: y( ?
+ v. n& _. k0 K9 H: D( yaaa和bbb分别代表寄存器A和寄存器B,其中寄存器A是目的寄存器。1 z1 u: S" B" e" w
/ f1 B% w1 ^( u; }( |; q
iiiiiiii:代表8-bit的立即数。' t; o1 F% J; x; h8 x9 q( i
' I) o8 o3 Z" d8 ^+ v, B* b9 Z
xxx:代表忽略。5 C, I9 s+ j: G0 l, ]6 r; Z, U

* ?: `' S1 y+ _# [+ W( ]ttt:11 bit的跳转/分支地址。$ V" j- U. F$ H$ {$ y

9 t* }2 S: n; e
9 N9 t# N: m" L4 b8 a) }) ^( V3 K9 z  I: C( _8 v
此外,这个指令集其实很早就开始弄了,最早是去年上半年开始的,现在是最新版本。" @5 G8 q9 z1 ?6 s5 k# _+ K1 b

- G" |$ u% \- Z0 m0 @

# b9 s( p$ b: y9 ]$ S0 U
6 d6 M/ c0 L' q' k, Z/ h" K
2 F7 C/ r; Q& Y7 u* p1 g: c. v. {$ I" H
- S& Y! D" n+ t

2 G  Z9 n! V) i7 U# d1 D, ]
% Y% H& u, @7 u& K9 k0 Q

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-26 05:41 , Processed in 0.312500 second(s), 26 queries , Gzip On.

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

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

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