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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
引言/ D$ W2 h+ j$ w1 b0 j
经过对OpenRISC近一年的分析与研究,在此过程中我们了解了计算机体系结构设计相关的主要概念,重要的技术,和基本思想。我觉的,现在我们有必要练练手了。( x8 t% Y" g% ?  v. ?4 H9 v3 ^3 Z

! H/ B; ]. Q  }' \- Y本小节,我们将设计一个简单的cpu,包括ISA的设计,模块的划分,RTL实现,编写asm汇编程序,用modelsim进行仿真,以及用quartusII的综合。
! x/ a8 Q1 B6 K8 V$ F
& t1 ~* k# m- A  V2 N0 Z
0 N5 F& }  @" ]! {* g! \' d# Y; u4 ^! R$ Z8 V3 n* b5 o
1,计算器与计算机
- |" |/ {' K' y4 M. c我认为,在EDVAC计算机之前的计算机,都可认为是计算器。5 S/ S. T2 D5 R* T2 W. |

. K, q) C$ q: G  M原因是,冯诺依曼对EDVAC分析时提出了二进制运算和加入存储部件,而在这之前的计算机是没有存储功能的,比如我们要计算(1+2)&(3+4),如果是采用计算器,其运算步骤如下:
. C# Y3 Q8 U9 L3 Z" U" C9 B. M: p) \/ _
a,先用计算器算出1+2的结果3,然后人脑自己记住这个数。- k* _0 m( l0 O4 j- M& q

1 z) @8 D+ \* C1 i. Yb,再用计算器计算出3+4的结果7,人脑也自己记住这个数。' C+ X1 V3 Q* v* P

. y4 O3 l* E' {3 `0 `c,最后用计算器算出3&7的结果3。0 R3 w8 I& e7 K2 c: U# P) m- F
( h6 d4 ]8 K5 G9 T5 m* T4 F3 Z
6 S5 h8 ~6 b/ n# m$ Z8 |# r

1 ^) f0 ^* U8 r4 C' C  \0 ^8 T7 i如果采用计算机,其运算过程如下:6 y+ {6 A+ \, b8 @6 H

2 c5 V8 H* w# `/ E7 O+ e首先我们需要写一段程序,假设程序放在程序存储器的地址0x0处,数据1,2,3,4分别放在数据存储器的55,56,57,58四个地址。1 B7 ~$ N* Z. p% f9 n

  a& x# r$ h: K  i2 Q程序的执行过程如下:
% R& ?5 `: U6 B7 J* w0 a, ?, e" z% i* ]# m3 R% t& {( O% V
a,将data_mem的0x55处的数据放到r1。
5 z2 O/ H! I+ n+ C1 p$ |( |9 x- [; j  k8 {
b,将data_mem的0x56处的数据放到r2。3 k% N3 K6 `% C. K$ H% r$ o
% ?9 H, n: g& v' G
c,执行add r2,r1,结果放在r2里面。
3 w! Q9 a0 {7 J3 B3 y/ q4 y0 s  h' T0 T6 m
d,将r2的内容写入到data_mem的0x60这个地址。
: g+ O- y  I" @3 f/ }5 [- k, l0 L/ P. o0 Z

- X/ @$ K; Z" S3 ^4 x+ {
( l0 Y- |. D" le,将data_mem的0x57处的数据放到r3。
7 _2 y& z0 S% W" T1 f; }  N" A$ Z; j
f,将data_mem的0x58处的数据放到r4。
) r2 J8 y4 v7 e( k; r" y' j! Y0 H1 V
g,执行add r4,r3,结果放在r4里面。& b/ t4 E3 h8 e
# j" p. Y6 e6 _" V
h,将r4的内容写入到data_mem的0x61这个地址。
, k/ P% g/ E- T' w  r0 t
! c' ~  O5 N/ A1 B1 U
7 b. G; z2 o5 ]: A9 O0 z$ d* w* G  i& Q3 }' t! |/ c
i,将data_mem的0x60处的数据放到r5。4 a' q) e9 V) o3 E

/ A8 }( ]; l  _% l+ j$ g1 J1 ]j,将data_mem的0x61处的数据放到r6。
$ N( S$ H  N! x
8 A& {4 |" b- c) G. I8 Yk,执行and r6,r5,结果放在r6里面。( h2 w2 V: B: Q) J0 }/ Q
: o! V9 s' U( L- E
l,将r6的内容写入到data_mem的0x62这个地址,最终得到计算结果。
, h' R7 D' k. l, D' Z3 {' I
  j7 x" v/ A8 o; E
3 n6 Q" z$ L  ^! R0 u我们可以看出,如果用计算器计算,只需三步就可以完成,但是如果用计算机的话需要12步才能完成。那是不是用计算机的效率低呢?今天计算机的蓬勃发展使答案不言而喻。% e8 ~3 R8 B% j& L

1 k* {* ~' |+ _7 w. ~) L原因就是只要实现写好程序,用计算机的整个计算过程不用人为干预。
: r% v$ i" x- @* u
' O4 F( F4 |0 ]( o9 x  K7 j: G7 e我想这正是计算机发展的根本原因之所在,就是计算机的出现是对人的很大解放。我们只要按照一定的方式写好程序,然后交给计算机,计算机会自动完成任务,而我们的手就可以干些其他的事情了!
4 z! l# I7 P0 d$ ^  M7 G3 [+ r- M0 C1 g3 u" P

5 d6 @; F5 t; A2 ]( S9 \" P: Z9 v0 Y. o3 t  s4 m
2,架构设计' t1 K2 @6 L! A& ]
1>整体设计
$ c, H. K1 L6 _通过上面的例子,我们可以体会到计算机的好处,下面我们就动手设计一个cpu,来完成1+2的计算。
+ u2 M6 n$ ]2 b! g9 U: S# ?# t+ r6 m, d5 R9 ^# G7 t
关于计算机体系结构,我们之前说过的内容已经够多了。这里只说明以下几点:
, Z# I, ~6 O( z6 f. f+ L% L0 U2 K2 C  z: T) C+ Q; O. D  W
a,我们采用harvard结构,即,指令和数据的总线是独立的。5 f) S# z. G$ O+ C8 ]9 d
. t% Z3 L2 ~1 K) @: z
b,流水线,我们暂时不采用流水设计,但是在最后,我给出了五级流水时的数据通路设计框架。
$ A$ e- N1 w4 `- i" R' `0 F& n( A* d% I4 J2 [" c3 u' l1 a
c,关于指令集,由于是学习目的,我们只实现基本的访存指令,运算指令和分支指令。运算不支持乘除和浮点。关于具体的指令细节,请参考附录。每条指令为16-bit。
8 \& |# g# k& @0 u5 B: F3 C, c6 y
d,为了对我们设计的cpu进行仿真和验证,我们需要设计一个简单的soc才行,这个soc只包含指令存储器,cpu内核,数据存储器。% L7 Y8 R$ F+ G
) T+ W, p6 q! r0 E2 H# l$ K+ a
e,core内总线为8-bit。这就有一个问题,core外是8-bit,但是分支指令的目的地址为11-bit,所以如果超过8-bit,就会有问题,暂时还没解决。  u# `4 L4 M) e. a2 o
7 S# l1 p1 O! ^! d& f6 M$ |
下面是soc的整体架构图:我们给他取个名字吧,就叫 tiny_soc,小cpu就简单的称她为tiny_core。
. u4 L2 {8 q" y# V* T* B( C' z1 |- i; c* o5 y

! p  M3 N/ w9 b' {! y/ \! y0 d. Z6 L2 J& t( n7 z

  `& t& {/ S$ k2 X2>模块划分
* W; M- \1 n- ~8 U2 o. i* xcpu core的结构如下:
$ B# u) W. I# _( V' ?/ M
" \) V( [3 `: Q8 {. ~; b6 g整个cpu core由数据通路和控制通路和调试单元组成。
4 |. k% G" r0 |# X) }+ E$ {/ u$ I0 g7 e2 P* [6 @3 z
其中数据通路包括:
8 x' j0 d; x- e+ n! r2 U  j( k5 K$ m
PC的产生模块:genpc5 g4 P8 g/ \4 k+ ?  H9 f6 ]

0 I# `6 ^# Q4 H  u运算模块:alu,在alu的前面是对操作数多选一的一个mux。
- D  w5 w# n3 H: h# r, Z+ g0 q# A) ~& h; o" w9 \
寄存器堆:regfile模块
: [7 x" i1 z( k: g1 w1 C
. E" ?4 p& V/ C8 I( ^! t! `. T# H还有栈:stack。" a6 N- v& i7 b

. {; h( I* Q' e8 u% D, ?( u( ?5 L

6 B" c" P0 A) t- |! L数据通路受控制通路模块ctrl_path模块的控制,控制通路负责指令的解码,并产生对应的控制信号。5 a) S3 h3 X. f- e' D

( e  |9 c/ v2 b1 Q% _4 \( c
$ J! Q6 M8 q3 u0 M# m- q
! H% L4 K, S4 x, Z# F调试单元,由于只是学习目的,调试单元最简化,只输出当前的PC值和当前的指令内容两个信息。
- O- n$ R  }' E+ y
  y0 @" h! h& z  M3 F# L4 p6 _* `) E

; K' f2 a6 d% b% w$ I8 Q9 p6 s  c) ^' e& j4 U5 n! d9 A
' k: u* F# S* u" d+ B4 q
% C$ r4 @3 D1 g) G6 @3 B0 S% l

/ r0 i2 ]7 |5 }. |) W4 Y( Z% o
6 M% W5 ?* D5 x, [, X3,模块划分与接口定义- z9 U/ z) C1 ~" m5 O5 y" P
整体的架构设计完成后,我们就需要进一步的细化了,这时,需要定义具体的模块名称,模块功能,一旦功能确定之后我们就可以确定具体的模块接口信号了。
9 |  e7 C6 a2 K) Q$ A0 I; ]: ]: I" p+ q' y) A
如果模块功能过大,我们需要拆分成更小的模块,这就是top-down的设计方法。关于设计方法学(top-down,bottom-up),很多资料里都有介绍,这里就不再赘述了。+ e( F+ \+ k# u. w: T) M
) e! ]! F* D7 s9 |
一个完整的工程,和做理论研究不同,需要处理很多实现细节,下面,我们介绍一下,其中比较重要的部分:6 O$ c* o0 Z8 U1 r) c; [

( j* A1 n* o7 y  G1>genpc模块: |  D  Z' G; r  `1 n
这里面需要考虑三点:上电复位PC默认值为多少?正常指令执行时PC如何变化?遇到分支指令时PC如何变化?
7 c7 S0 D* l5 F/ i% D4 E- @( h; L- D/ G4 B( {
关于上电默认值,我们可以通过一个define语句来设定,允许用户后期修改方便。
3 t: M# k9 s5 i6 [, {; c& ~
1 ?, C1 `; }; [- L# b* \" N关于正常指令的指令,PC是加1还是加2还是加4,这要看指令存储器的访问方式,我们的指令存储器是每个地址放一条指令,每条指令是2个字节(16-bit),所以我们只要PC加1就可以了。0 m% X# V: B. H0 b1 M

3 D( ~) P! K2 |& j  b* R/ c8 Y1 o关于遇到分支指令,我们直接将控制通路经过解码的跳转地址赋给PC即可。
6 [5 M; l: E$ s! @1 h8 \$ P2 T& w) W' s
genpc模块的C语言伪代码如下:# \: z/ k" ^/ V6 Y: o5 T
6 v) @* F3 p1 h& S* D( b
+ u0 h5 ~3 b3 L7 W1 e; E5 m% n( _) h
+ a# l6 r' F/ F, p2 V( Z
genpc module pseudo code
, q8 t7 L) r$ t/ B
' w  d( N' K" {  Z6 \! w* k; Lif(rst)( G0 ~+ }! c3 L- [
{* t9 M& z; f! `. J% L. X  [
        pc= boot_addr;
9 \$ a, T8 Y9 U* P% e}
$ L7 |( Y$ i5 |) delse! Q! y% z& f% ?) V9 M3 b( T
{! V+ t5 X. v5 U; ?
        if(branch)  X- l+ _5 J0 R2 w  ]2 I  i  N0 c
        {& L- k3 V+ t5 q2 N4 x" b
                pc = branch_target;
, ]+ t& t, V$ [0 ~        }
! g5 x4 b: b8 H6 Q3 N$ \        else- w& o3 a8 D" `8 C  E# ~
        {0 y0 U+ K. x2 i& }1 B+ T$ p
                pc = pc +1;# L4 P5 p  x+ n6 R; J+ d7 b& n
        }
1 c4 Y) X8 v6 e) a7 h% s}, [0 @" o; E+ f6 Q

5 P# ]; u8 n! M5 C; Y4 k' Y- x2 ?3 O; H2 ]
2>alu模块
* ]$ q% p$ {* [. F# |+ ?) [alu模块,大家都很熟悉了,是执行单元部件,负责运算指令的运算工作。2 Z8 H# Y1 @" d
/ |( Y" v2 g: A  O- ]( D5 n
这个模块的输入信号是有控制通路的解码出来的操作数和操作码,输出信号就是运算结果。
7 X) J2 W3 N: j9 C5 F) |8 q2 ?& B8 ], z8 B" S
需要说明的是,这个模块可以完全是组合逻辑电路。
8 Z$ P1 T! \, H: ~
) o5 e! ?7 y( f# Y2 o; f
3 T8 C1 G# W2 Z# I; e( n
. L$ a) v# I) J6 W/ {! b3>RF模块5 Y0 ~6 `1 z6 V
register file模块,从物理上来说,就是一个block ram。0 `/ N; T( [; x  ^/ ]+ ~/ k' f

# c5 V3 u2 _* w从逻辑上来说,这个模块是对软件程序员是透明的,寄存器堆和指令集是软件和硬件的交互接口。
5 d# x7 b5 U+ U
2 ~+ `7 x- a4 }9 w1 [
" z) t+ `5 d, ~6 V$ X% N$ w9 ]! ?4 @8 `
4>stack
4 n4 J8 L6 _  }; v1 W9 C0 O8 A" A) Bstack(栈),是用来处理分支指令时,存放PC的值的,比如,我们在处理子程序调用时,需要先将当前的PC+1压栈,等到遇到子程序返回指令时使用。
1 K9 l# m1 Z% L6 @# v8 s, o2 a4 M& x9 h$ }7 L7 f. |
栈的特点是LIFO(last in first out),这一点与heap(堆)不同。
, m0 q! n$ [9 |! a% k! i' h
4 i8 W3 `" u+ n+ i2 T* n" C; n8 U) P

) G! l- x" y& G2 A% g- F5>ctrl_path模块" B0 `% ]3 I+ A# \1 \; ]
控制通路负责将genpc模块产生的地址处的指令进行解码,并产生对应的操作数,操作码和控制型号。这部分信号比较多一点。
. |* }; p' I9 O  V2 u$ m; E" l9 _9 J" |, F4 C

( m2 Q* i9 L  a& z* f% W
* d& A; l& X! d6>tiny_soc
9 T+ z5 u* d' ?: d. e' w为了测试这个cpu内核,我们需要搭一个最小系统,包括指令只读存储器insn_rom模块,里面存放机器码。
3 B# `; x: P+ H
! x7 W0 U2 i/ \7 \% m& M由于是harvard结构,所以还需要一个数据存储器ram模块,相当于内存。
9 I$ J5 j: g! Y& t4 K  m/ \7 o; K8 r; F$ _9 k- g
当然,如果想外挂其他I/O外设,我们只需要定义其地址空间即可,需要说明的是I/O外设的地址空间不能与RAM重叠,各个I/O外设之间也不能重叠。
6 D' Y7 f: D4 q- h  d  H3 e+ l* j# M, |" Y
RAM和I/O外设之间可通过一个arbiter与cpu core实现数据交互。
5 R& \- k5 r8 N# @; F3 H" d" U2 ~4 N5 c2 h9 z7 H, e
当然,如果存放指令的地方不止一个,也需要一个指令arbiter。* \: I; }% p3 Z" N: F! y. {9 S

! B0 J; ^% k$ v( O! x9 {) k7 p' b. e& S9 y( u
; O& H, ^4 l- X
4,RTL实现$ N$ g6 H- `" C, z! N5 v4 @
在完成模块划分,接口定义,仔细分析考虑模块间时序之后,如果没有什么问题,我们就可以进行编码工作了。
6 U8 }8 h4 i; |0 T& D  V
* ?& Q  _" g3 J6 @2 A' p编码,需要注意的是编码一定要规范,信号命名,代码注释什么的,尽量要仔细。这里直接给出RTL代码(verilog HDL)* h% z' }4 f* S
5 u+ z1 K5 d/ d9 p
按照自上而下的顺序依次给出:, ^  D$ \  p' |" q' O# w" n% Z

- e# N$ H. F+ M( W2 `- ^, l& z( p8 @2 n
; ]) a9 z. n! H2 t
1>tiny_soc顶层模块:soc_top
7 g3 D0 P  g& _  N3 x; a) E! _8 y3 K9 \2 V+ X/ i, d. S& f& ?

( Z$ r" J: V( X0 A, ]
5 M( B2 v: Q& F" ]( V/ l6 U/*
% q/ a, u/ K$ x3 Z$ T8 U8 \*: a0 b/ i* V/ c6 M, q8 H: z
* file name        : soc_top.v( d# F! l9 N) _) m; i" m& S
* author        : Rill' ]' v) c  j8 R8 j$ k6 {/ ]# [# M6 y
* date                : 2013-08-11# J# S/ ], z, E2 Q! _5 \
*
1 B0 l" b: C6 x3 f*/
6 @8 _! Z' f* V6 Z+ n# ~ % h7 Q5 Y8 P0 A4 i
`timescale 1ns / 1ps; [. ]0 m" b; t5 T) F
" }7 E4 W5 O, L( M1 o
module soc_top! C4 W6 J/ |0 Y% V1 G8 x0 l
(
) S* {# L" G6 b& Winput clk,! ?0 U7 V% V+ ], j1 L
input rst
! Q7 m  d' N+ L);, A( V5 X# `6 x- z; C" w

; y% g5 g6 M2 h7 J& u3 L
, y/ u9 }& Q6 T3 l0 owire                  read_e;
/ @  F7 w7 Q0 c5 @' O; S1 lwire                  write_e;8 g2 W7 M0 @- I4 c7 q8 s
wire [7:0]         port_addr;. H2 E3 s: g$ c1 V# P, b( q" t
wire [7:0]         core_in;$ o) b$ s) `$ z" K3 B0 N
wire [7:0]         core_out;
3 D7 B8 W% @  U( @wire [15:0] instruction;5 t1 j; I; m9 g+ @9 W
wire [10:0] inst_addr;$ m9 o! Q5 I0 y' u8 i* ^: ^

/ |( g! ^/ S# @- h. u+ b3 [1 ?wire [15:0] debug_insn;8 ~# V7 B) T/ M5 f% Z# c' ^/ P
wire [10:0] debug_pc;
% Q$ _3 S/ z4 M4 Q* |6 N! n ; Y" k" @& Z- H. E
insn_rom insn_rom
6 J6 P0 g+ b0 J/ f0 \( a5 S(
% \" l& O) S3 \! H, _, m.clk (clk),
! o' b+ ]  }9 Q: B3 g1 Y.rst (rst),8 ^  |! c+ k# V- _) j3 [% t
.address (inst_addr),
* a% F- m; y( d.instruction (instruction)9 b% L$ D' M7 ]0 A. I
);& a- z+ R6 h& k: E

# o$ I. ]5 w, d/ E' ]% C7 B) j! \core core
, N0 g# W+ \2 q  i) Y(
/ ?3 m& D! l/ H( P.clk (clk),
- p( H; j! [# A5 r1 `.rst (rst),
$ M& X1 {$ q- ^# J8 \. T
# ^- F% s2 B. U5 ?% k9 [0 o( t.read_e (read_e),1 S. y- W* i0 F4 A9 [) S/ B
.write_e (write_e),
4 V/ A5 M8 E5 d/ e! l" p.port_addr (port_addr),( B! C+ u  K+ y5 A: i1 d) L
.data_in (core_in),
$ h5 g9 [* ?  A& {8 G; ]8 @: m.data_out (core_out),
/ q& e  o# i- r% [7 f.inst_addr (inst_addr),
/ K5 D- Z1 x$ ~1 X; \.instruction (instruction),4 ?' ]6 i/ s. ]7 Y8 ~+ c
.debug_pc (debug_pc),
. F( t6 |  c3 j( R.debug_insn (debug_insn). X+ m# e9 Q9 l2 K; R5 R+ l& w
);
4 z  |+ N$ X' \0 g  T5 N, L 8 x8 D8 U+ u5 X+ g" U
ram ram
% j5 O9 R3 L# h3 ?8 J0 o$ G' x" i8 I9 E(" D9 e% }6 E0 q1 ^2 P
.clk (clk),5 c0 B* @. \% ^8 f" P
.rst (rst),
. ?$ ?7 c* r# T( g
9 D+ b0 Y4 J' v5 c- \* p7 p) _  S.wr (write_e),9 Q% v3 F5 m, Y/ J& _( m
.rd (read_e),* ~1 `. D  V" @& R* y$ R
.addr (port_addr),
, `/ f9 j: c/ d9 K: G.din (core_out),
* J. q4 G" W' }6 y* V, }6 h.dout(core_in)% K* O  X& @8 Z* Q
);" _4 V, F4 Y7 {; e0 ~& B; @8 h' I

  O4 S9 J7 c: L4 \% E
/ D& `1 V# Z$ N$ O9 J% f$ Y- s       
8 y- E1 Q3 H7 q% z0 lendmodule
0 D" Q6 I) L5 j4 M
* k3 \8 f+ e5 z, G
# O- ~* U4 m& P* v* K# [/ S
. s0 L8 y; h4 S# u- [/ E$ G, E  e1 I- J6 D+ V- O* S
2>指令存储器:insn_rom
' _0 N& o; y* S; h1 @  x+ _
: c2 C. j5 _0 U) L& p) l
' o1 J" J( W: u( B- H4 K2 U( T9 o3 h# Y" K5 ~* I$ s# W
/*9 J0 |+ t  u" Y9 g8 G
*
8 I2 {9 D1 ~9 p" g8 N- Q  R7 L% k* file name        : insn_rom.v
# R* p* j1 }. `' W/ i$ N8 E* author        : Rill
3 g4 B' g. V6 J8 s% P8 ~* date                : 2013-08-11
, K0 m6 C& _8 e! o$ ]2 Z- |2 G) k*4 C3 u# Y- b8 J* v6 ^
*/
3 V& c4 G1 g( x/ u3 C
" X5 N( Y, |# V6 J2 o
. k! F% p/ W- W& N! T; j
9 X0 |1 U  w1 v5 omodule insn_rom
% C1 y3 P$ o8 ?1 g" |/ i8 c(: E% E; N% P& @3 r9 S- J7 X$ K
input clk,) J1 Y" Z9 Q' n+ t7 S
input rst,1 b+ d! |) F4 ~
input [10:0] address,+ e" x+ ]" E, Z* S
output reg [15:0] instruction
% [0 b9 x- I: P/ J) j/ L);$ F# F2 E7 c" ?% D8 I0 H* F

4 _% l" H4 R+ N& W' B: a//(* RAM_STYLE="BLOCK" *)5 y4 u  [& ~+ D# J# O% [; Z" ]
reg [15:0] rom [2047:0];  {) p& V* T  G7 O: S3 t% P0 ?' Z

* n- B( ^. c& s+ Talways @(posedge clk)4 I) B: t5 B  y8 ~& A
begin6 Q( t- n* w6 f" Q( p
        if(rst)8 _) q. D/ Y- H, J1 m2 D' I
                begin9 t- l  _& w3 a# z- B
                        rom[0] <= 16'h5801;//0:                        jmp start
- n8 q/ l  R* q- j; Z2 d- B                        rom[1] <= 16'h1101;//1:start         mov r1,1
" S, \0 h$ h1 U: D0 \                        rom[2] <= 16'h1202;//2:                        mov r2,2
* N' A2 j( ?2 J9 H                        rom[3] <= 16'h3220;//3:                        add r2,r1$ a- t* B% E" V- R
                        rom[4] <= 16'h2237;//4:                        str r2,559 c5 j- F1 z$ H4 g! t4 j; z
                        rom[5] <= 16'h5806;//5:                        jmp end
) Z' a6 Y# ^$ V( t+ }. h) [2 u                        rom[6] <= 16'h5806;//6:end                jmp end*/
% ~  W2 q3 Z* b9 G7 @0 A                end; _  c: P) {& d5 ^0 O4 @  }! v4 j& O
        else
( f$ z$ m4 T' b4 p9 _+ f0 u8 k                begin
( D, h/ j5 G2 X. l. d9 S  r$ Y                        instruction <= rom[address];
# C( ~! J9 F$ C3 @, C4 S                end
, r& x8 [1 m& }$ a0 L* d6 Eend, S# L& i" o6 B7 y' J

9 l1 B; n$ E5 @2 ?; O- M' A
: g5 j) j" o2 _$ hendmodule; g; Q1 b4 @4 I- i" y: Y/ }
9 L/ ]  l! u1 E' b. t: {, e1 U2 K4 N
$ j, ~% G5 C; \9 x( R, a* w2 e( P
3>数据存储器:ram  [: e( a' ^; O0 K& m+ c, P$ J! h
- _. s3 v6 Z7 i$ G* b# B) H

* Z* B4 l8 p: R
0 G9 ^8 ~; \& c( H* D+ y*0 @6 U' W# t1 Z% P& z$ P
*
6 \. W4 l3 `$ ]# W( f7 o* file name        : ram.v9 Z0 D0 b6 A5 Y( {6 i* B# m( ^
* author        : Rill
4 N. l9 N2 b( ]. W* date                : 2013-08-11
8 k9 L: F  g4 H% W- e*) ]6 H4 ?  L" k$ H5 X6 j9 R
*/9 J3 k/ b1 s  b
/ O. Z( D+ w. P! u3 x

$ S3 ]" |1 |& H" f  G8 hmodule ram(( k% w- |  p# C+ j) s, n
    input clk,
3 z+ F9 r/ ?! g9 C& ?        input rst,
, c4 L" n# `4 u  Z  T       
; q& v/ r5 A7 A# l    input [7:0] din,# D# g' G4 i& v; ^/ H  _0 p
    input [7:0] addr,- h% p! o8 ~. Q5 q
    output reg [7:0] dout,
& a7 X7 }' P4 b    input wr,
' i0 b0 g  r7 p6 V" g7 i7 [# D        input rd) V0 G* Q* @4 o
    );8 a$ {! i% E1 B. I9 v4 x

6 m( w5 O; O% k   (* RAM_STYLE="DISTRIBUTED" *)
2 @1 M$ t' ^- }3 L, y   - q& M; I: {+ u
        reg [7:0] ram [255:0];
% V3 L( Z' t& ?2 ^6 R
  e% @+ H3 f4 ~/ n# A% o   always @(posedge clk)
* X) d# ~* N) Y3 ?+ T& l! Y        begin; X2 ]7 F+ E6 ?
                if(rst)& {7 @3 _  U# R" S% N
                        begin
6 f  ?* {. E  e" ~! a, R                                dout <= 8'b0;* h5 G; |! Q* q0 i4 H/ o8 d
                                ram[0] = 0;/ ?4 E& o/ {3 u* y" }
                                ram[1] = 1;
' _- s% c# \* k; n; d6 G9 t. J) j                                ram[2] = 2;
' Q3 `. c6 Z3 X  s' b                                ram[32] = 32;
1 Z- O- j" g6 R7 s+ g                                ram[64] = 64;
* V6 N+ V+ M& \4 Z3 f & g# z, A5 Q/ d- R
                        end# i! Q5 g; {& U, U$ r
                else' S( z2 K7 ~* `' P  T) K
                        begin" B6 Q6 E$ r7 }) S
                        if (wr)3 q$ r: x' [8 m9 i7 q( t8 Z3 s
                                ram[addr] <= din;; r$ W1 B; V: v8 w  s! D- o) A
                        else if(rd)' }* y, }% O, A$ R' s6 E, Q
                                dout <= ram[addr];
9 a: s( r% N" I) s9 S                end
8 d" u- S, U0 l9 z        end
7 U0 D8 H/ n0 e9 ]. x* A5 S ; w+ X& s5 u" j! ]. w+ l
endmodule1 o- V% g! w" \0 p; Z) S
1 g; \, n( G5 k: a
8 I! s! h, B+ C9 U- U: k+ d
4>CPU核心:core
0 {4 f: R& x5 M/ K1 C( s
' `* L6 p6 o* y) ~. l- J3 m; ?
" q  M6 w1 v; k& `9 D
! A6 {& ~7 q  ]* b7 C- {/*
. v8 y7 f7 x3 a! H6 V*  |4 a+ y+ C6 N0 C' ~
* file name        : core.v
/ s) V5 ^: A! S0 {; d* author        : Rill5 R  }+ i" m4 N
* date                : 2013-08-11
$ ^4 f' g  u; J/ F*. ^$ h" p7 O( o; X* e0 k
*/
3 y# z# k' X* D% E/ S' U ! r3 ]* t1 D5 j. T  e9 _8 ~% o
; C4 g: R" M& I$ L1 b5 K- H* J2 s

& {. W+ x* g0 e( [; ^9 J4 x, I  P6 Emodule core
$ R7 K5 F- @7 n! i4 k; e* c(
5 N* h( k* E2 @    input clk,
3 I$ s) `9 }( a- b/ l8 p    input rst,
. y( z/ f* }8 N" m) R0 j, D; [# M    output [7:0] port_addr,- R2 B: Z5 R; P  p
    output read_e,
+ C# n( G. y5 o: }) |9 R1 X! G" J% H    output write_e,  Z& K# O3 T" O+ a; ]
    input [7:0] data_in,$ z8 ^! I& @* ]* `
    output [7:0] data_out,# Y2 r! w# M0 g& H5 o
        output [10:0] inst_addr,! g6 z+ D; P- _9 x8 X- K5 p
        input [15:0] instruction,# e9 o' a7 f$ e* T. C
        5 I( }0 x9 ?9 N
        output [10:0] debug_pc,//debug i/f
) ~* {' y- a, C4 c" F7 s% |8 a        output [15:0] debug_insn" n1 k3 ~! M/ B8 D
);1 l& D' a" K1 O/ C

7 ?- t8 a5 O! Z4 b0 z. Dwire z,c;4 w9 Z# r% p& j: Y! m+ R( w) j6 p6 |
wire insel;
) B0 s) f9 S) N6 Q$ x/ Y6 nwire we;
. A) V, n9 B' A7 L9 |/ O2 b. g' awire [2:0] raa;
  @! Y0 l6 P* s* Fwire [2:0] rab;
  B' x& \  a2 x! m% Kwire [2:0] wa;
2 I$ d- A% }4 Mwire [2:0] opalu;8 m( `8 u- f- \$ t9 M/ c
wire [2:0] sh;
2 O6 e$ R& }9 _+ Mwire selpc;6 K  [8 H4 g$ b- A8 o5 k
wire ldpc;
+ J) \5 C; i, wwire ldflag;
  m* R/ ^' t. q! rwire [10:0] ninst_addr;
8 W' n# j5 }+ @. Fwire selk;
, \( z1 l$ e) y9 `6 Uwire [7:0] KTE;7 d: I* n9 k1 `9 x6 ^4 F: v) M
wire [10:0] stack_addr;+ O- n' I$ `& k1 y" Q: ~
wire wr_en, rd_en;' i9 ^; Z! V, \
wire [7:0] imm;
% |. B9 M: a9 s0 B8 N: ewire selimm;
; u, t# K  V" q3 S/ ]
. F& k7 r) y( a+ a
+ T1 r* s' @6 c( ~" r
  [4 P+ F2 U  B2 A4 @! q% k
8 W8 C; N7 u, Econtrol_path control_path5 p( v" q6 J9 a7 \' E) Y) J8 w" F1 I  o, I
(
6 c5 p. D* P  a& T.clk (clk),; Z) E* V: q% B! Q! {! r- z* }
.rst (rst),
& D- |5 @5 v* L3 Z/ v2 [. a$ _0 R1 u.instruction (instruction),
; c5 h4 e& D! c8 b.z (z),
5 B3 P6 H) Z' V: f; L; d& i.c (c),
% M8 h' C$ s: Y( K! v  F6 A.port_addr (port_addr),
$ o, _3 A5 [' n! n: ?! E  C.write_e (write_e),* |  M6 k5 ^" M0 w
.read_e (read_e),/ \0 F1 L5 I  ]6 h! o' _1 `, @3 @* _
.insel (insel),/ p. P4 D" h& l0 f1 e! S5 ~& ~+ y4 B
.we (we),
0 D9 A% B& j7 Z8 {% B& S.raa (raa),. H  C  P1 }/ K
.rab (rab),
0 R5 q2 @3 g  @! M/ T2 z.wa (wa),$ G  Z  R4 v) M; D* q* L5 ?
.opalu (opalu),1 s  N3 W) a2 x+ _
.sh (sh),  m% O8 K( M# }0 e( {! i8 ^& d
.selpc (selpc),8 k5 |/ p, ~8 ~
.ldpc (ldpc),$ T+ V/ ~) }9 v5 l) y6 S9 p
.ldflag (ldflag),( E7 T# @: }3 H# c
.naddress (ninst_addr),& i5 d: N, Y/ n  l
.selk (selk),- s: b8 I, r& y9 U' R+ {6 R0 R
.KTE (KTE),
" y+ F6 @# M2 K( V+ J! j.stack_addr (stack_addr),
# Y2 b. L/ k+ U* I.wr_en (wr_en),
4 o, R) m9 K: t/ u.rd_en (rd_en),9 g3 ]( o7 ~6 W$ y  O
.imm (imm),6 K; P; c  R+ ]& h; b$ X7 B4 B
.selimm (selimm)
# P& V+ B* o8 o);; x& a' d- h  P" @2 j

6 z' {/ Q+ N/ W * ?& I* e2 \' ?2 [. A0 G/ P4 h4 B

  i- o2 [. @3 K7 Z, i  ydata_path data_path_i
' L& \5 |: [3 Q  Y9 U# q6 M(2 m/ s, u- p/ G5 a5 y! |8 w
.clk (clk),+ x4 A- W0 C& E& a
.rst (rst),
- |$ U" ?! T- H: V& h8 |) g  h; v.data_in (data_in),3 b! m3 `% c# e) \7 z
.insel (insel),
4 t" B# S3 |& j) L.we (we),' l  C# H& {# Y5 t& L0 M
.raa (raa),
: x% k+ P; m" L4 @$ m. }& S.rab (rab),+ r7 I: }2 C2 T2 ?
.wa (wa),
* \2 k& c2 u  ]/ G# y2 w4 ^.opalu (opalu),# z' q* S% H. f7 o+ u* J
.sh (sh),
& A3 U! Z1 e% H0 v+ a.selpc (selpc),
4 @! m& u7 d0 X2 S1 ?) {/ L  k.selk (selk),
! w0 L0 ]' Y) g.ldpc (ldpc),: z0 B( }. p$ q( U- m
.ldflag (ldflag),
4 `2 i! @% F( l" B) `* d( I.wr_en (wr_en),
+ W; s+ F: |" t, |) _* C6 a$ B.rd_en (rd_en),8 F9 w' |7 c, _
.ninst_addr (ninst_addr),- ?) R+ }' D4 J$ D* o2 \7 v
.kte (KTE),/ [- ?7 u# C  P1 }
.imm (imm),
: h! |4 a1 |: r.selimm (selimm),+ N9 U) V" Y1 Q; q7 \
.data_out (data_out),  p# U2 }' P6 ^+ f8 e, X
.inst_addr (inst_addr),: Z4 G) c, G6 t
.stack_addr (stack_addr),5 t% z7 j, d8 V& C
.z (z),( ~! z$ s/ |5 j: D: X: a6 j4 s6 _
.c (c)
; o, v3 Z! k7 F);8 ^: S8 i1 ]( E! K; _8 |  c8 |

; T6 M' T5 b1 r4 k7 vdebug debug. o9 }, }& q" x
(
" D0 z6 E$ K: F" x' q" s.pc_in (inst_addr),
  a+ o1 V3 z% m; T3 \" p.insn_in (instruction),
; ?9 t- V* ^$ J 3 D% K2 |$ s& q
.pc (debug_pc),
) H( x' F" q7 i.insn (debug_insn)
# q1 o! B! W/ \' M& A$ c+ C);
  u( |% z$ G' P. n: T' i0 m2 ]3 a
2 M/ C/ g, S: n/ u8 i( l& D : _' ]! q! H# v% B5 S
endmodule0 P- X4 e3 G0 Z9 X6 k6 ~  V! M; Q! \

5 O( V+ A" E* Q; }- s; W/ F: }$ C; f4 y+ I) U3 L
5>调试单元:debug
+ M# U, C3 l) |* N4 z. q/ g8 x- B
- X8 k3 j: L" T$ Y/ l# r
8 ~1 i6 j3 R. Q- w
/ _- \1 X: p/ w8 i3 h+ F/*
3 G  S5 [+ F$ |* p3 W*
+ Z0 m* Z" \, O  O) j* file name        : debug.v5 C2 _, p; r" A* e! a% R) t
* author        : Rill
: ^2 v+ G0 H2 u  i3 B5 P7 [- q# {* date                : 2013-08-11
. P* ~4 P0 O" F; ~! H3 s" T  D*
4 n0 K9 |# l1 X- K' k*/
- k, E5 |' O% h* T1 |. k1 G ( c0 G8 B- z8 _
7 v$ L  C1 V  Z$ V8 O( W1 y" h
+ v( q! f$ @2 u" [0 P! F
module debug6 N" {# C5 g0 i( L
(+ O% S3 \% k" X4 Q6 N
input [10:0] pc_in,
2 w* v. R/ `% _input [15:0] insn_in,
! T5 \1 }2 C6 R/ z+ n6 h 7 A: u' n6 y* k% t3 T4 o9 Z
output [10:0] pc,
- d& `, ]/ k3 D( F8 _' zoutput [15:0] insn% u. x/ ]& K# g4 C
);
/ U! S' u# l  o1 _, C " a" Y) s/ @; n8 {. `6 q
assign pc = pc_in;& f2 j: m! W, t% j
assign insn = insn_in;" y, v4 \& g+ e
# i9 N9 K5 ]; c) ^# d
endmodule: j6 F2 A7 c- X, F5 b2 [' p: b

$ o  l; Z) F8 W2 d! q9 S
: ^1 H1 v) k! j3 p7 ^, J9 r% x6>控制通路:control_path
& R: B2 y& `1 E9 i9 z
' W6 V$ o6 G8 C- Z3 n7 |+ {" w
9 ~$ I# g5 f1 h' @0 [
3 q4 n$ q/ R* x, q: l1 c; L: E& w# N/ d/*" S5 y- T, M  v. |- x% r' \& i
*4 \- o+ u, |- }" @
* file name        : control_path.v+ F7 U/ O/ h4 P' D! E; V! I
* author        : Rill& R' }0 l2 t. t1 ?! a. o
* date                : 2013-08-11
' M% k/ Y2 c& d$ P$ Z  h7 F3 S*# F/ {, \. J- E- Y4 \, p0 g! A& b: k
*/: B  b$ j8 {0 t$ m, u

, G, q; p& A& }  {+ s# T0 X( `
' S* @9 I0 \! s" o
5 s3 v3 p8 F5 P* umodule control_path
- F8 Y( x$ H* F4 f) e+ k() `( F. N. G0 M4 `" [7 ]
    input clk,
+ {. f. f' y( O    input rst,
+ m% q1 Q6 ^" e& k    input [15:0] instruction,
7 C5 y, Y0 ~- D+ l# _. h    input z,
2 g. i" K) I" W- M    input c,+ ]% O( _; r# i9 ]8 W( s6 _
    output reg [7:0] port_addr,
: h0 {9 o8 c! C8 Q8 D! S    output reg write_e,. m7 p& Z6 A  w) f5 B; R
    output reg read_e,5 E. x* C  \- j4 `
    output reg insel,2 o9 |( R; M3 B9 x
    output reg we,
  w2 N! U. i- w/ ]; v2 }    output reg [2:0] raa,
, O+ E5 u9 ?" _) C5 \2 t    output reg [2:0] rab,
5 [4 Y; G) k0 U; M7 j6 M5 r    output reg [2:0] wa,- f+ Y' }5 @7 A( Y0 e
    output reg [2:0] opalu,
& r+ ^$ }% r2 i* Z' w    output reg [2:0] sh,
% D4 _, s2 D: }: Z3 n    output reg selpc,
. B- [' c7 z. X5 M# [! \    output reg ldpc,
1 H8 ?: E3 S# x5 Y, ~* m: P& o    output reg ldflag,  t- Q$ F4 M) K4 B2 u5 _& b
    output reg [10:0] naddress,) k* n& _  t1 q+ |2 v. Z6 F
    output reg selk,
7 h, n, L1 g% k% a2 S/ t; s    output reg [7:0] KTE,# D# L* @+ P( j+ t. i8 Q' U+ P
        input [10:0] stack_addr,! S% D- D; M0 P9 D2 x1 o
        output reg wr_en, rd_en,
2 H! {" p; l4 ~# c) @8 w9 K# h/ C        output reg [7:0] imm,
6 w' ~8 c* [% S' T        output reg selimm
5 m& g4 n- c7 X" @/ b    );
/ [& O/ B6 L6 u% `% w9 s7 @! D 7 z+ e) p- ~; T4 i

3 Y% C6 M+ r+ G, I! uparameter fetch=        5'd0;
# d' g" R- G. h0 k7 b. f# @parameter decode=        5'd1;
- O- k# R# o4 b$ i( K6 y& }- N+ `* G: N& A
4 n2 g2 K$ O2 c2 A+ m/ Eparameter ldi=                5'd2;- u+ L- R$ J0 b0 S; g
parameter ldm=                5'd3;) G2 c( a  F7 x1 K/ B0 |( T' ?
parameter stm=                5'd4;
' A3 F; c0 ~$ j5 Q! k+ t0 J* ]# Tparameter cmp=                5'd5;
, L2 }& Q6 o, s, @+ I8 L1 @8 Wparameter add=                5'd6;
5 W) [8 Z: }0 y( s' ?4 S/ mparameter sub=                5'd7;
- V  I/ ?! A( Z, T9 W/ |" R( ^# kparameter andi=                5'd8;
1 D( _" M4 P' i& R2 P, x0 Jparameter oor=                5'd9;% a& ?3 e, G$ O5 C, R+ l$ R, u
parameter xori=                5'd10;5 U6 g. E6 Q& a" M# S
parameter jmp=                5'd11;) t% Q# L' O+ j, g3 U+ q' C
parameter jpz=                5'd12;, f0 G" f  g1 w$ L
parameter jnz=                5'd13;
; s4 p  W4 |8 Z5 Gparameter jpc=                5'd14;
! z# o: ]" ?) x0 Uparameter jnc=                5'd15;
0 g# G/ H; E* F" ~, d9 Y# Bparameter csr=                5'd16;) _  n, D1 f; C9 |2 S
parameter ret=                5'd17;. g4 q9 {7 L; {' t& W
' w& g7 v$ g) ~/ i- {
parameter adi=                5'd18;6 V2 o5 Z$ g+ [( r5 C: I6 R
parameter csz=                5'd19;
2 b& C2 O% P7 z  V! wparameter cnz=                5'd20;! O& }" N2 S  R4 i
parameter csc=                5'd21;' w& e$ f0 V* I2 ?9 w5 A
parameter cnc=                5'd22;# h- G' E5 G. U% k- c- P. a
parameter sl0=                5'd23;
9 i1 k1 s# d$ q/ [parameter sl1=                5'd24;9 T  E0 l; z# K7 s, i
parameter sr0=                5'd25;3 V8 b% D+ ~# z4 a. Z
parameter sr1=                5'd26;6 |, \4 P1 h0 V/ \
parameter rrl=                5'd27;
/ }0 ^1 o* ~) P1 Z) s6 yparameter rrr=                5'd28;
: \& f- a) z: s8 z- o" B, kparameter noti=                5'd29;
! k  d% U; e* S$ i3 V/ J$ w
5 q2 t/ J9 f  Qparameter nop=                5'd30;/ G& C0 ?; B6 l6 C" W
' h6 F- K( E' W" J3 i4 b' ]6 j* w
wire [4:0] opcode;
& d" O3 m6 m+ i; a6 ~reg [4:0] state;
: s9 O5 a; O% H* m) ? 8 X3 B. m) J$ @! n" Y( s7 ?; V$ J
assign opcode=instruction[15:11];& j  S) t6 V0 M
- K) X8 S! g+ N9 _! B
always@(posedge clk or posedge rst)! n4 E2 ]" a4 x
begin/ R: J. R' ?! ]) X7 r
        if (rst)
6 Q2 V: Y) y' v% n5 x! G                begin' r* H% ~& P" P, l
                        state<=decode;
! ?2 `1 T; c/ }- y. t8 Y9 P                end
3 N3 f# G) ~4 z& [" }, Z) ^( |                : U3 N" k5 L2 }$ o0 L+ G
        else1 S2 K: q0 a% u9 U
                begin
9 n  S/ L9 d9 x1 K2 a                        case (state)2 _6 l0 k  j6 T  z" X" g
                                fetch: # g$ C  e$ d! F( n" d) n
                                        begin
$ t2 _& G4 \( o' B5 ]                                                state<=decode;
% {7 _7 ]; u' I3 ^: a8 x7 g* |5 m+ _; c                                        end
# [; {5 a/ @0 { . @2 @4 P# M0 T/ _$ U! Z) m
                                decode:
2 `( h' `+ b( Z# L8 b                                        begin; e) m5 c+ p* S+ {5 K
                                                if(opcode >=ldi && opcode <=nop)
5 o% S6 n) p4 E3 O                                                        state <= opcode;//state just is the opcode now$ h& X% K, t$ s$ @( g; L8 L
                                                else+ w6 z/ m. [/ v% F: @
                                                        state <= nop;
% x' d2 t. B- R! C, G                                        end% z0 F$ B/ z# Y6 R6 v5 g/ M& u, h
                                       
. R0 x( e, ^! i& ]                                default:
6 ^) F  h/ t% Y/ q5 }% N                                        state<=fetch;; t) `0 G- Q* `  s! c) X
                        endcase
* @3 k1 V5 K' j                end
4 p1 ~+ b0 G! i4 h  i               
; m: o* j* o& B- Lend       
! F2 D4 Z2 S; n; H+ R- i % a  i% n8 T4 [

: b5 R5 f+ H' O* D) \% ?always@(*), d  L. J8 @0 @% x  M
begin
3 W! h* w$ Q) @5 C                port_addr<=0;1 d9 n* Q; A- a
                write_e<=0;
$ a/ {' D; @! }8 Z5 L9 r0 J# O1 P                read_e<=0;6 }! I2 C- q  ^) G% [+ u
                insel<=0;
6 m+ x5 d1 d& x" E- }                we<=0;& G: E' v3 @& }- d/ ?8 c
                raa<=0;; J9 K  G0 }8 \
                rab<=0;2 L3 ^: V+ P$ N$ k
                wa<=0;3 C( m% m* w2 _0 D0 o+ z
                opalu<=4;
2 l" d8 J* }( c  `- E9 @' y& l5 n                sh<=4;
6 t9 t2 D& h) J                selpc<=0;
! ^  Q+ K! u0 b+ |6 U6 }: d  ?                ldpc<=1;
! m2 \/ ~4 B. E2 o3 X7 N( A1 g                ldflag<=0;
4 B7 Y( l/ k8 m' [9 v+ @& l6 w$ B                naddress<=0;
* o) a- m! `- N! O' u8 \% c. X                selk<=0;* [9 ]0 j% c8 K7 \, e
                KTE<=0;
8 `  l" R7 y  l' i                wr_en<=0;" k% N" A' V7 o5 A% j
                rd_en<=0;3 D, z  ?/ r, m: r
                imm<=0;
1 u5 a) G( M4 g2 ]1 n1 ~                selimm<=0;
7 J" Y! \0 @6 i& k2 l) T! n& k               
7 q7 g2 }! i/ \# v- T$ w                case (state)
" B4 d! D7 Q; m# U9 S0 \                        fetch:         begin
3 s3 a; {; H! L/ m% z                                                ldpc<=0;
/ V* M( J4 O% I0 L+ y                                        end
1 r0 m5 S" p$ k- I 4 v/ T5 v/ {; v- _; R' Z, {
                        decode: begin
; c1 f" J1 f( i                                                ldpc<=0;$ a# l) K% F7 u. _9 w
                                                if (opcode==stm)
8 l& u) O! C* X1 E9 Y                                                        begin
" b+ j8 a" U$ i* i! k                                                                raa<=instruction[10:8];
3 d: s0 s1 ~* @7 n  v                                                                port_addr<=instruction[7:0];
5 X4 b+ T$ T  `6 T                                                        end
7 e/ f8 V4 S9 P8 t( j9 n9 `                                                else if (opcode==ldm)
" c( Q1 D) E. ~+ K4 U                                                        begin% z: `) ?* _9 R6 {+ m1 j0 p: h- \% x- u5 J
                                                                wa<=instruction[10:8];# g( W' ^" q- ^- n! J2 g
                                                                port_addr<=instruction[7:0];( N( |5 `" i! j' ]
                                                        end4 I* r) O) R! ~( M5 d' u
                                                else if (opcode==ret)+ |) s& U8 T1 o1 K, S, N: r
                                                        begin
: j+ x6 W+ S: v+ B/ }                                                                rd_en<=1;
1 x& D3 S* x" P0 K1 B                                                        end5 T& [5 t# J" Y" q
                                        end
* W6 T; ]0 I4 p                               
; B! i, i' u) Z. t, M8 a+ S& B  m                        ldi:        begin
% e& |4 f! s; ^: |                                                selk<=1;
( c! {; }% P" g' Q                                                KTE<=instruction[7:0];
  S, {( [& z5 C                                                we<=1;
# b- t- s0 K9 f8 \( e2 Z# e: J  v                                                wa<=instruction[10:8];0 n# G* A6 |' F# l" f' P# X& m
                                        end
! M) K, _4 P5 h% D" G                                        ( }* \: K2 g8 y2 X; D' I( w
                        ldm:        begin
; I2 F8 u% l9 G                                                wa<=instruction[10:8];
3 p" ?; T$ B& w3 |# l                                                we<=1;' {; D0 n; @" Q7 g; J' i" U3 j
                                                read_e<=1;
" L- E) l- s5 u! s, d                                                port_addr<=instruction[7:0];/ W; S( t% [+ r" C$ _0 M
                                        end
- _. K, D. Y0 g0 D. U                                        3 _9 I( o+ u9 ^% M9 @6 E% E+ J0 I
                        stm:        begin6 F2 I0 [  _& F  m; P  U. L
                                                raa<=instruction[10:8];$ D  \) n5 o! {; F1 y. y; w: B$ y. w$ c
                                                write_e<=1;
& O, v. z) I2 v. {4 p' E& M' i                                                port_addr<=instruction[7:0];
) l1 I9 ]% x% q, K' _' z                                        end) j( E. }# z6 I
                                       
  L6 X9 {/ R! w5 h" t! a) K& K( ?                        cmp:        begin' a$ u% }+ U/ b
                                                ldflag<=1;9 s* Q1 f, X' ?+ a, O( a7 o
                                                raa<=instruction[10:8];) o0 C6 ?* M9 S% _4 P  K7 h1 O
                                                rab<=instruction[7:5];
: b% N2 |% d3 e                                                opalu<=6;( C3 j. u; ~+ `' x) ]
                                        end
, [( O; T) i) l. q; r6 `- m, E% u                                       
* u' O& ?6 R+ M/ D) _1 i% S# X( ]                        add:        begin3 p* s/ }& f( |9 |2 ?8 r+ F
                                                raa<=instruction[10:8];) ]# ?& R, h: X
                                                rab<=instruction[7:5];
8 r8 H& p* Y8 d6 Z2 O                                                wa<=instruction[10:8];  a1 U# b" `8 J% B6 a% t8 y% H9 @
                                                insel<=1;
/ C- m# x5 o: \9 J                                                opalu<=5;; W5 N" @0 _: n1 }
                                                we<=1;8 }: Y0 i2 Q) o4 e  H- o
                                        end
4 ], }  ~# Z1 P3 n5 y: B                                       
3 q4 x8 m2 ^" _2 W                        sub:        begin
) w. M. m: z, u! g+ Q) V, l# v                                                raa<=instruction[10:8];
9 K0 ^& P$ m( V7 j( ^' C                                                rab<=instruction[7:5];
6 ~8 j3 U6 ^2 J! U7 X1 v: I8 n! V                                                wa<=instruction[10:8];" W1 j  |/ u) A
                                                insel<=1;- i, k" @3 [: b4 V* o- W
                                                opalu<=6;
0 |) w: d( I& ]3 q. k- K& W6 s                                                we<=1;
7 _9 g5 J8 s/ {. j) {- y, J                                        end
! i/ ~2 v9 d0 C. o  ^                                          Q" Q; a) F, d. \+ P
                        andi:        begin) [1 ^; A: A- h# o  X& w% ~
                                                raa<=instruction[10:8];
2 Z. l% w1 R0 N! w; s' n                                                rab<=instruction[7:5];
2 a3 u$ S: g( z7 a! C: o2 _                                                wa<=instruction[10:8];/ n8 J- |% ]! x; b- f4 W
                                                insel<=1;
) {6 z8 p8 o9 c/ s! D# _                                                opalu<=1;0 @/ y: c2 d3 U
                                                we<=1;$ g* f/ {9 E$ i
                                        end4 ]! z0 Q& R9 m  P6 P
                                        4 P! T9 H, t2 T: o1 \, l
                        oor:        begin. T, u+ P4 Z# `. C# ~. v& E
                                                raa<=instruction[10:8];
& ~' R" t) ]) ~5 p                                                rab<=instruction[7:5];
, [8 y' v5 M& V                                                wa<=instruction[10:8];6 r: t: T/ s. l1 n7 ?- B. u9 I
                                                insel<=1;
6 N# B. \7 A0 n% r( L) r                                                opalu<=3;
0 o: \7 e3 Q# k8 w9 y3 r, Z! j                                                we<=1;& ?( B( B8 q, e1 w- l- ]9 q6 c
                                        end; X/ h3 ^$ A) U5 Y6 L: b
                                        $ r- @; {/ J& [6 D- A7 T" U
                        xori:        begin
( ^/ l+ H5 l) m' R  X& H6 Q                                                raa<=instruction[10:8];2 H4 P; m* @9 {1 c" n5 u
                                                rab<=instruction[7:5];9 U9 C8 @$ M. U2 B5 N# X7 E
                                                wa<=instruction[10:8];' e, B+ [+ K! s' c
                                                insel<=1;
( w! m4 R0 S+ A                                                opalu<=2;
# ^" z( u6 T8 O6 w/ ?5 Z* E& [                                                we<=1;5 x2 [8 G; ~  b
                                        end
( l" D- R5 ^$ r% r& p% b4 p' K# _) x. f                                          u$ e0 a) `; w6 p% s
                        jmp:        begin/ S/ Q( F+ q  R) n' J  E# J
                                                naddress<=instruction[10:0];& Q, g! x- h1 }) Z# J1 e( _5 Y
                                                selpc<=1;# g& p9 P$ h' T6 Z
                                                ldpc<=1;
+ ?5 d+ k( J. h4 s9 p# h9 U$ ^                                        end/ E* M$ {% W  K1 D/ O0 o
                                       
& ^6 B, L7 d6 W$ T$ E) [2 }* S                        jpz:                if (z)
/ k8 Q: l1 C/ D7 g# n5 C- d  d                                                begin
( \% w+ h! V, {2 b0 D                                                        naddress<=instruction[10:0];* r5 k) V$ R$ u- |
                                                        selpc<=1;7 |8 G, W3 h% E1 O- C- C
                                                        ldpc<=1;
: t3 {5 S: r$ H% G' P, j9 q                                                end
3 [$ q. }* S. v5 L2 a, t( h                                                                                & y5 f7 r/ v3 L5 C0 Q
                        jnz:                if (!z)$ y# t+ b# N. K# w5 `
                                                        begin
: S( X* @0 l2 h7 @" f                                                                naddress<=instruction[10:0];
- j8 U, M( @0 Z/ \! g6 d% G                                                                selpc<=1;& j' q& {6 ]& Q+ A# S
                                                                ldpc<=1;* w& |( t$ B4 o9 N9 K, ]9 @! g* H- h
                                                        end
8 ]2 L; V2 `! C                                               
; |. A) q4 X# q5 t* o- l" H, R                                       
# ]: b+ ~9 l2 s2 _) _7 I                        jpc:        if (c)- d0 N: X! X3 m
                                                        begin+ w7 q! m  p$ d- {
                                                                naddress<=instruction[10:0];6 \5 D6 W1 F+ M* K8 y5 c  T
                                                                selpc<=1;
2 z5 w9 u) n, T2 }- z% I2 b                                                                ldpc<=1;
* ^8 Z/ ~3 `& S6 v                                                        end, I" I' J5 z, G4 p' ]" L, j
                                               
1 x) m3 b0 X; u3 F5 v                                       
; @7 J* x4 ^: K  E; g* k6 |                        jnc:        if (!c)3 Q! Q( z9 m/ V0 V" Y
                                                        begin6 s( n  b' {" N* A; d/ C% |: f) M
                                                                naddress<=instruction[10:0];
" x& _5 ~6 B6 q# `' K+ z* e* y# s                                                                selpc<=1;
# n- Z, t/ G1 b6 i9 X% d2 Y                                                                ldpc<=1;& t" ]5 Z2 V7 s1 T; R2 j4 ]
                                                        end
% \8 ~6 j& M! i0 ]                                                          t6 K* {- F+ p+ ^3 O
                        csr:        begin
( F& F& g/ K% U" e8 i; ^                                                naddress<=instruction[10:0];( j- Y4 |2 w9 q
                                                selpc<=1;6 B" T2 V* ~" S4 o: f
                                                ldpc<=1;
2 d7 U2 m/ @; K7 A2 S2 N                                                wr_en<=1;
+ X7 ?/ U9 h# u9 B6 d' p5 Z5 B                                        end
) U& d& p; R2 V2 H) T                                          @1 Q0 a6 s+ g( \, m/ {3 ]5 ~
                        ret:        begin
) o; T' I' A8 f                                                naddress<=stack_addr;* r, a- a9 M( H
                                                selpc<=1;, }; U, {$ d0 g0 U3 J* L
                                                ldpc<=1;
6 A& g* m- ]8 Z6 w                                        end
, {0 W" S1 E9 [9 m" y& |5 ?  |: b                                       
* o% _- S3 l) O" [9 K* R                        adi:        begin
6 \3 z8 }- ]5 B                                                raa<=instruction[10:8];: k( z" c$ I% s# L* g- V
                                                wa<=instruction[10:8];
+ j8 X+ V# a' T' r7 D8 U5 @( M                                                imm<=instruction[7:0];8 G3 [( o5 I7 Y8 I* P/ K
                                                selimm<=1;1 F% a/ F5 y& [: _6 z8 z
                                                insel<=1;; f/ F' L( A" I5 r0 Z$ [/ x$ D
                                                opalu<=5;/ U9 ^7 P- e3 x1 G) }
                                                we<=1;( j, f% J9 b6 l8 P4 N  [! i
                                        end        8 W8 g5 q( P# Q# Y; i. y9 F
                                       
/ z* m" A6 S2 V$ Z% U, S                        csz:        if (z)6 F- _. Z. W1 a2 d( K5 |4 ^
                                                begin3 L$ w. [" C7 }) Y% Q
                                                        naddress<=instruction[10:0];) E. v, j3 m/ Z& a! F/ _
                                                        selpc<=1;
8 d# R& A- ^* V) w' d# ^( T# ^: {                                                        ldpc<=1;2 T1 y- c* O3 ^1 l2 `# P
                                                        wr_en<=1;4 o7 F" B9 B7 Q1 _* p* W" h: U
                                                end
* H/ M) I" U0 V7 B: S6 n/ J/ G$ }                                                ) X, Y+ |: Z' H3 j$ w0 C
                        cnz:        if (!z)
6 Q( y% F& ?8 _2 Y: c% r                                                begin
! T# q- C4 B0 u& c                                                        naddress<=instruction[10:0];
' u8 C- C! H3 j+ T% t2 P                                                        selpc<=1;1 k7 A( v3 t' T6 O, ]
                                                        ldpc<=1;) A, S. U) `- \4 ?6 Y$ A' u' E% l
                                                        wr_en<=1;( N8 W( f) V; R  U
                                                end; g7 ?- s; v/ D
                                                % ~, m6 {5 u8 ?/ Y! |
                        csc:        if (c)5 o- |2 @/ U+ Z2 \) j2 E) z
                                                begin
5 c1 J) Q7 q, C" Z6 _                                                        naddress<=instruction[10:0];
1 O: ~9 _+ S# |; K5 r' }) w                                                        selpc<=1;/ q- o3 ?  o8 k6 W: {
                                                        ldpc<=1;3 y- g3 E$ A, ~, q  n' ^
                                                        wr_en<=1;% f- c( _# l/ w9 V
                                                end
- H/ F7 C( l5 ~8 t; A/ m                                               
. m2 @% o! g0 J3 W# X2 `                        cnc:        if (!c)
% y( j$ ^2 |6 w* u. g, t& S                                                begin
* K6 k* D; l4 @$ G7 N                                                        naddress<=instruction[10:0];
  ~2 R( x8 l1 {( C                                                        selpc<=1;
& C: {1 Q* `' Q: S: Y8 _1 ~' B                                                        ldpc<=1;8 K( a' P2 ]' q! m1 K
                                                        wr_en<=1;+ g, {2 m! L7 s7 t. g
                                                end
( j3 }1 G; u5 J% {  I                        . v" x) _- b+ G% g" c' T: _/ ~' Q
                        sl0:        begin       
! |; N) G& l+ W" h8 q8 Y0 q                                                raa<=instruction[10:8];
) i/ n  t0 F" ?+ o3 Q- M. v: K' {                                                wa<=instruction[10:8];6 E* u5 K# F0 N
                                                insel<=1;
1 e) [7 M3 Y5 w$ g; i- i9 s: G                                                sh<=0;
: [0 r1 a  D1 z" k( O                                                we<=1;9 J0 S3 \& D' Q9 i8 w3 f% ~
                                        end
# C, j" y; p& t2 _- s- m                                       
- f/ \& @3 n- y+ S& k; {3 a                        sl1:        begin        * d$ k1 ^  `) k8 D0 ^
                                                raa<=instruction[10:8];
. X! H% N3 x. S7 s4 ~  j                                                wa<=instruction[10:8];
) E2 i$ B+ U, a1 O  ^' V+ r                                                insel<=1;. C1 C, V: U& h# }( [
                                                sh<=5;
9 C* E$ g; U( `& [8 Y                                                we<=1;# v! C- A2 N: U- a
                                        end
7 s6 y+ w; |$ ~+ ^                                       
* x8 F- W0 P' Y. i  H& v                        sr0:        begin       
+ ^& o; R3 Y$ Z5 r3 O, f4 F                                                raa<=instruction[10:8];: I1 W% x. h1 L8 j* O' @
                                                wa<=instruction[10:8];, v$ Q! J7 \$ k
                                                insel<=1;
) C2 A& N& S& X. A& s# K# Z) E                                                sh<=2;
, c6 t4 j5 s, D/ G( E                                                we<=1;) d) I% i) ]2 R* F! ?
                                        end
  _$ r8 G0 F( X- M4 T' L                                        ; M" s4 y, I% H% j2 r2 ^* ]' ?
                        sr1:        begin        * ~$ d3 u2 y$ O0 y5 p+ V
                                                raa<=instruction[10:8];
5 y( L% p6 g1 z                                                wa<=instruction[10:8];7 C7 U3 I& ]# b! H2 Q
                                                insel<=1;
3 T" S( f1 S/ ?. x5 {5 P( }" ~                                                sh<=6;6 G! _3 z, G9 U* \0 q7 a9 H; a
                                                we<=1;
" n) k* s3 T* Z- k3 H' D  M                                        end       
$ r; q& J$ A7 K1 a. L- S & r! w7 c* P* i3 ~) J5 B$ a
                        rrl:        begin       
! c) k& C! k  U                                                raa<=instruction[10:8];  e1 W9 J( c- L1 f$ b
                                                wa<=instruction[10:8];! j* _1 [" T- ?  N
                                                insel<=1;
5 [. S7 K! o$ Z! w$ ~( d                                                sh<=1;
( P. d' c, Z7 y( i% [2 ?                                                we<=1;
; ?  c9 A5 H& \% ^0 X+ m, m% f                                        end                                                # r0 ?0 U3 s) _7 H, P
                                        ' A8 F  P" ^6 R9 \
                        rrr:        begin        $ A( h  N3 K# q% }7 P3 Z
                                                raa<=instruction[10:8];
* x% w; K( d$ ~- @                                                wa<=instruction[10:8];& Z/ l) T/ v8 [1 q
                                                insel<=1;/ l1 E' r1 I  G, m6 D3 p4 D; v1 v
                                                sh<=3;
# U: Q  n4 I& f. ^7 n                                                we<=1;# M7 H( ?5 V5 Z" D
                                        end
% i, Z6 b- L# K* K- U% d                                        0 ^+ `7 b' a) O  P9 t7 x6 t& ~* V! z
                        noti:        begin  ]2 t( ?" s0 W7 z; m
                                                raa<=instruction[10:8];
+ O( D: a3 {% p( m5 }" \                                                wa<=instruction[10:8];
/ ^# Y$ I9 }" ~4 D  R. B* F8 j1 Z& c                                                insel<=1;
  m# k) ^& x: \, j! |1 @1 U# g                                                opalu<=0;
4 O' }4 ~5 F9 t2 G" O  R. v+ c0 ]$ r                                                we<=1;- q, T0 w( L6 N2 G+ _
                                        end6 c- r7 F. Y' M2 A! J1 j

0 s+ R$ O8 O5 W) V9 G( J                        nop:        begin
* b" w0 z" w' \2 L# U                                                opalu<=4;
2 m# k& S1 q, }: @                                        end       
6 g; T: {; i- k1 M                endcase
) c. o/ r* v/ f3 Jend
0 E4 U+ }: P/ H% C5 K# T1 Y
- M2 ~" i' d8 y! _7 J " e" T) i' Z" f& L7 K0 q7 _
endmodule
" Y' D, t6 L* i* q
& M+ H4 t! z  w  O+ b
# [' S/ p# v. R% Y( h7>数据通路:data_path: Y( v3 H4 d' Z- w+ ^9 \! F

* `# C: `& E7 q0 I  ?# G
. E( c+ H8 I8 K5 J: O' X: N: J) ?( L& D2 h; g+ U5 o3 w
/*
. L7 s3 C& ^; M: ^, |- X*
. A; e$ P! n6 D( l5 n4 d* file name        : data_path.v
6 d" @. K* s+ f+ {4 h- J" J* author        : Rill
- U0 D% B  s% W% Z  P* date                : 2013-08-11, C0 R) |8 X9 D8 f+ E1 h% o7 }& {: h
*1 O) f# x: `! ~/ B8 p& ]
*/
5 J/ G7 P) ]: b1 v , Q" J. b3 g7 P& N4 q/ j

3 ?5 Q5 {9 c8 l
( W) E) C2 E' w8 Mmodule data_path. j/ y0 v9 b* ~+ s- P) s9 v
(8 m! ~1 e! ?$ i5 z. P6 P8 C3 k
    input clk,0 c8 j3 ^9 A& Z9 `% |5 J
    input rst,6 `7 T! s% m  X/ G
    input [7:0] data_in,) q; u0 M6 l6 c2 l% r
    input insel,
3 d' ?( d  [, h    input we,( p5 y& h  }: t7 ?3 |2 [, n& ?
    input [2:0] raa,
8 R+ h, S  d( `' E) v/ w; I  \    input [2:0] rab,2 @3 y: [- f' C0 v8 S$ P4 h
    input [2:0] wa,
$ P  e# B& h, S# T7 J+ H    input [2:0] opalu,9 t& U3 r4 ]( w" ]: S' T3 p" P
    input [2:0] sh,( e; S) d+ b6 V# I% D
    input selpc,8 ?7 X! t5 T* M0 p- B7 `
        input selk,. E. q2 N9 s; \) _& H
    input ldpc,& ]/ R# [' P- B0 h9 ]1 \% E& V
        input ldflag,1 ]" c& D4 Q; n0 H1 v, K
        input wr_en, rd_en,5 Y6 V. E. }9 w! G
        input [10:0] ninst_addr,
0 d3 f8 m$ k/ a' B* O3 i        input [7:0] kte,! O, j, k4 x9 w7 v! ?' m
        input [7:0] imm,
& }0 {- [5 m$ |* r0 Q3 g        input selimm,
: t$ S$ o$ E' F. f- y# o/ R    output [7:0] data_out,
- O" q. W7 [- s2 x: O6 _    output [10:0] inst_addr,1 m- {( o* X1 K" B
        output [10:0] stack_addr,
' P3 f. z) s  l8 ?9 H        output  z,c: D, @# `2 y, Q+ H7 _. S: p
);( X( |2 k# P5 i5 X+ `% {
1 d, a4 l5 V: Y' Y( N+ o
wire [7:0] regmux, muximm;5 t, c' b6 x4 o
wire [7:0] portA, portB;
# j! j9 e& C4 H: Z) m1 F
" |, Y  `) L- M* Pwire [7:0] shiftout;7 w5 C2 }( O% |/ w' h/ P
1 z; |1 ~8 V! u! N" ?3 O* t' M
assign data_out=shiftout;
; x8 i! Y6 A& J* z1 Z3 l" k: W " f6 g" _: R: L' f9 Y& ]
3 Y# ~: e; d- p8 m% ~; D2 o
genpc genpc
3 \% E+ }1 L' X(
& S& O6 A' r6 A# s! `) R.clk (clk),
& H) j4 T8 g: M/ C) D6 G5 ?! a: W% I.rst (rst),
4 Z& }5 i' F, t: y
/ R0 `, T1 a9 y3 y( t# U.ldpc (ldpc),) Q/ U# g% H6 p; \
.selpc (selpc),3 `2 g! E' Y: b8 u$ I) A& `/ i. F( V
.ninst_addr (ninst_addr),0 \/ M8 ]. u8 m# ^5 e, p7 r9 h9 ^7 l
! N& u5 m# ^/ a0 g3 c$ y5 r+ M1 h; j. y
.inst_addr (inst_addr)3 Y7 U5 s: x/ Z' o
);) g! f2 u) z0 V% A% U9 I+ O
; V. v- `5 B3 A! k1 K6 r  t- }2 i" k: y

: m' U7 c0 W0 ?+ ]( A3 E! Aalu_mux alu_mux9 m" u& x4 R  Z' [$ @/ h0 r
(
) O+ c- C$ i! _* K: B, c.selimm (selimm),
/ w$ V# t# O/ P  U1 J/ E, P+ A8 x6 A+ a.imm (imm),
2 G8 j+ k: b6 E" M% q.portB (portB),9 n# ^) s/ Q( f% S

! F5 A+ \, T& F5 I8 Z! u3 i.muximm (muximm)
! N8 A6 C) }; h( u: s: p" I5 v7 [5 S);
  m$ m1 R6 z# |+ W7 S/ H 5 K- B- V$ |, _5 D
alu alu: B0 F! d: Z* \8 I& J
(
. ^! L0 }; s. g  \; M3 {.a (portA),4 }$ `4 |& q4 q8 B
.b (muximm),3 p$ L6 C: V8 D3 P
.opalu (opalu),
5 E! W! O) ~6 d& I& ^.ldflag (ldflag),
' Z- M* H& n% T; P.zero (z),
9 l$ N' N+ c% l* p6 E.carry (c)," A- e7 F$ j: T5 I; a* Z
.sh (sh),
) z: x( n* @7 M! R! J  r$ J" A7 ~7 w.dshift (shiftout)
  f# G5 A* i4 a, T);
. e2 B# c" R3 I8 Y
% U. J5 k+ z  j
! h8 }' Q* X+ i7 e- I2 k. Wstack stack- b: K0 j5 q; i
(! q% Q2 S" s* M) m3 {
.clk (clk),% I+ |- r% Y3 ~7 ?9 a- D
.rst (rst),
) m" m/ f) e' s.wr_en (wr_en),
2 l2 m( w  f, _* m.rd_en (rd_en),* e& D8 b. D- \
.din (inst_addr),$ m' c  g+ x$ n! c
.dout (stack_addr)0 e7 `0 W+ T4 O
);
) }/ z/ _' Q' ~- L ; v2 W' G" ~! C* b  V

; M& d0 w3 H5 B6 i$ D  ~" r" {4 rregfile_mux regfile_mux
. F* B2 `' L' E& }4 O# @  c(
8 r3 |4 s  S) G/ Y.insel (insel),# I, L; y( K+ m+ D& O
.selk (selk),. w0 W8 Z0 l* W5 }
.shiftout (shiftout),
3 [0 ]/ b% ?0 m: x8 Q) [! ~.kte (kte),
) I% L* q) M' R* t- p+ C, @3 q. V.data_in (data_in),9 j8 ~6 l0 z7 }( y2 k

. X4 N6 i0 L, }.regmux (regmux)
" W1 J. `5 D9 {5 ~4 \; O);
/ @+ q9 @0 i4 V% T! ]+ x- F8 N" Z 5 B4 n  j9 Y/ T
regfile regfile- Z% C% B. k& `2 [; ?- Y# q* E
(: _" N: S1 h/ @
.datain (regmux),8 [- @6 P6 R9 {# V
.clk (clk),% ~2 i5 _# K# B$ F2 |  e6 g
.we (we),& {( P! l1 }7 q4 z* V- [8 |
.wa (wa),8 q% i  F+ D$ @8 g5 |& z
.raa (raa),
5 [8 z; ]. p% `# h! H! c& \.rab (rab),
. I2 L& d" c, }$ I0 a. H. \.porta (portA),: |" F0 U9 {+ w
.portb (portB)
0 U3 `) m; w: @3 m2 ^5 }# x5 ^6 _);$ {1 f6 p' k, m

$ [0 |, |8 [6 B$ E5 _; Q
, \9 R* G7 v  G
& l% u; l, {( X3 g# Eendmodule
( l) \1 C. L+ l
: C2 J9 N8 P+ p+ M& m3 G7 u- @3 e) P9 Y+ k# L
8>程序计算器:genpc/ j5 w4 G. S! j$ Z  b$ D, n* _
1 @& m" T' k3 q* i
" M( k# L# B; ^% K( k  C

0 F3 l* F- Y) K# d2 b/*
9 C, }7 Z7 B4 t3 N*, H- B9 o; z* x! {. Y7 F4 Y3 Q# e9 S
* file name        : genpc.v
5 M: m, m/ a! m( f) Q* S7 \( u6 [; a* author        : Rill* S; E2 J6 B. d, g; t( }3 D* W( }
* date                : 2013-08-11! o8 Y2 h8 o3 r; }6 t
*
+ c) t  j( |2 e+ y*/; {# ?8 A: [9 K& w7 g4 U
7 s; e" t  m9 }  R! a. ^9 f! O
`define boot_addr 0     //boot address after power on
) g8 `+ o" b9 ?  J" g7 e: n
7 f/ Z( n. B* U- l0 u3 zmodule genpc
+ w% X* A: G: X! F& g6 s(: o7 W  D/ U. L
input clk,8 c9 F- O  ~, K2 v8 p2 i+ _
input rst,: }" W) W( ^4 M" p3 t. v) Q
5 D6 j9 s  ^4 g! }9 i9 i1 f
input ldpc,
: c7 e+ Q* X. e: Hinput selpc,
& W# Y6 x& h# a9 j7 ]3 L2 ]3 ginput [10:0] ninst_addr,
' s6 i; M0 G$ w) _: [$ t+ O
! T4 z8 Z  a$ g9 R0 ?3 Boutput [10:0] inst_addr) n5 a$ Q9 W. O  V* X
);  s$ d* T7 M5 c

& j& }4 l: s) ~% B9 [0 Mreg [10:0] pc;" s5 Z% q: e; \9 h* F) Q8 V
+ p' c7 c( L  O0 D
assign inst_addr=pc;
, Z2 X# A6 r: C7 h# T , Y8 A- u" _$ Q" b
always@(posedge clk or posedge rst)
! i' G. v" E$ a1 |6 Xbegin1 I8 e9 p0 X" F3 b6 P) r- V
        if (rst)* k/ n# j- Z1 ~
                pc <=`boot_addr;
9 d7 U% ~; v$ |( S4 b% p  O! w        else
) u. H) M" N; }3 h                if (ldpc)        9 x4 E6 P4 Z! _4 V0 V
                        if(selpc)
' ^1 M. H0 i1 g, P- g                                pc<=ninst_addr;
; s( y/ L/ u8 w* _. b8 v                        else
$ a% K2 v6 w2 y6 J: w  G* ?                                pc<=pc+1;3 F5 `, m% R- H3 p  F. l
end4 W# U3 X& b9 Z
7 e# `3 [1 N+ B! ]
- @; K5 B" j" K- @; \7 h1 T. r$ |
endmodule8 A; u) z) J/ l7 F

9 d+ z4 A( L- F- \, ]
& x8 ?+ ~$ g% G* l
  X' ^& C& s) G1 b1 ?- o3 b; v& l% i/ R0 J( ^7 r/ W" W( T
9>运算单元:alu ,alu_mux
* i% w& ^4 i9 x6 y" m5 v% r* Q
* q' r2 H5 j- Z* q/ H* L2 o0 w8 e3 j$ U$ k: E
/*8 J# L& Z6 a2 j' A: _
*
3 G9 ]/ b6 a- V5 k* file name        : alu_mux.v
; N# c+ F  P/ u! f/ O+ w* author        : Rill6 L* C; K2 C, S& p$ ~% V. n5 |1 P- S
* date                : 2013-08-11: K- k7 _0 Y3 b2 ]  ~& F; p
*0 p; h* g# B9 R6 g* `
*/
( o+ h7 |, m& [  U+ {! b! q5 r 4 w1 c' g' E$ m: ~

2 S; f8 o! U8 `5 \# R* v2 o( K  s
, A; }. J1 A7 mmodule alu_mux. p1 Y8 V' `! _6 ~: c2 Z. c! h
(
' d+ a% _) i, Y+ k. ainput selimm,+ C* ^' L8 r+ m) k8 K8 {# B; j$ i
input [7:0] imm,
6 Y7 m1 [) Q+ o+ z2 F% Ginput [7:0] portB,. p! q0 W5 g5 n7 w

/ x% Q! i5 ]; ?! y+ M/ t& Routput [7:0] muximm  [. |$ w8 ?! P& a' ?7 r" {
);
- I# G7 {$ E  z2 D ) V1 R" N: C4 v+ v
assign muximm = selimm? imm : portB;//result : imm if ldi insn,portb if ldm insn
6 V0 m: F& d( f" L2 C , o& F1 l) |, V. @

% O' \. n! \3 _! s" Wendmodule
' @$ Q1 H7 o. t* a7 }/ t4 _& N+ d9 n, {6 n: f* u& c7 i

/ g1 X  c9 Y, O& A$ n/*6 _5 Y: d* b+ C9 V' M6 ~
*
7 p% H; \2 Q/ D9 l1 j* file name        : alu.v- q- J" a: h. ~' g( b# Q0 j( ]7 \
* author        : Rill( v- N  A+ }+ l/ s
* date                : 2013-08-11' `! s7 C/ N% U3 ~4 r2 Z
*
' [1 C  s# b7 o" Z*/
/ I% h+ u) L' b: h6 o6 A+ H, I- B & l- i4 K9 |# A0 G

" ?! q% B/ H. C2 P8 @1 Q; {
) l* z; H' B3 E* w6 a8 hmodule alu% @9 m: w& x6 ]) n5 f% {
(5 p7 l( X. h1 j, ^+ g$ X, c8 A
input [7:0] a,
7 F- m% Y, G( J1 T5 s8 Minput [7:0] b,
5 E0 y/ s  Z3 Xinput [2:0] opalu,
+ P  A: I9 Q- n1 b5 Iinput ldflag,# t; Y1 C' p" U  T5 B
output zero,7 E8 I+ o- R- a0 _7 w" d2 g
output carry,$ ^& z4 }0 V+ R) a
input [2:0] sh,
8 @# R: D/ V# N+ m. ~output reg [7:0] dshift
1 P+ Z) i  a7 m$ G% k# m1 {);8 O+ @3 _5 Z+ x9 C, t" }' c

8 u7 a! b5 Z' d& c' wreg [7:0] resu;' R; }& l" z* Y# @5 E& p
+ U; Q8 T; F3 _" \: B4 R/ i
assign zero=ldflag?(resu==0):1'b0;/ O/ V; R8 b: a/ E. H

! K1 l9 y5 `/ x0 y2 U9 M* n1 m. o" }assign carry=ldflag?(a<b):1'b0;1 g8 F5 }* I2 `. w! Y

# w. U) R! T: g0 Z7 n: e# b5 |always@(*)( b: {7 l! e3 k
        case (opalu)
% A4 V8 u) C6 ]! u                0: resu <= ~a;4 m( G, Q3 a4 J/ b: Z7 Q$ f
                1: resu <= a & b;
$ Q( H0 T& n6 R9 b/ y' r; `                2: resu <= a ^ b;
% @0 P: h$ c' R' v7 Z                3: resu <= a | b;6 ~6 E& i( {% X
                4: resu <= a;
9 c4 A8 a0 x! h                5: resu <= a + b;
' ~% B7 A7 q. p. w7 Z& R& w                6: resu <= a - b;( y3 Y1 ~. J3 A4 a, m7 i# M1 \
                default: resu <= a + 1;
8 x9 y4 b/ p- p- \/ Y  ^: j: Z0 p        endcase
. H5 q7 k- K7 ]3 P3 t* ~       
+ h# F1 o# P: Q% b3 R        9 F$ u4 X0 w* a; `7 _5 G
always@*
- U' `* w7 B' M1 h- b                case (sh)
7 B  r3 W5 C4 E5 |, ?1 U  U% h                        0: dshift <= {resu[6:0], 1'b0};
1 i9 i: m  i6 H7 t                        1: dshift <= {resu[6:0], resu[7]};; M' q, Z  m% G9 R# S3 s; P! e
                        2: dshift <= {1'b0, resu[7:1]};
/ p9 d" ~5 j7 }4 `+ Y% B                        3: dshift <= {resu[0], resu[7:1]};7 M0 Q5 n. w# J, X
                        4: dshift <= resu;/ l% u2 u% i2 A# N/ Q
                        5: dshift <= {resu[6:0], 1'b1};
' I0 X# S- v6 i4 m+ i% C                        6: dshift <= {1'b1, resu[7:1]};
5 O. ]% E( z! a# U: H, X  E                        default: dshift <= resu;  L! g! |6 D' t4 `/ A/ p
                endcase3 S% Z9 ^1 H' f- I

2 E/ v6 x# d- N% X+ G# s) B& uendmodule
/ V5 u6 j2 r5 }9 ^/ g  b# ]: N, w3 b( G9 [$ P7 l; F
- q! m: B+ |1 `1 R
10>寄存器堆:regfile,regfile_mux/ V1 {" I  v! M
. ]! m2 }, F6 O/ W( ~, O/ q$ S
" r. V, j' b' [5 A. s+ {3 @: ]
" D6 d* N# X1 `1 m7 z
/*
! {, t( ^3 W6 A% b$ ?/ m' Y*5 E! [1 ^5 Q! w/ n! Q. Z
* file name        : regfile_mux.v/ q0 |8 S7 Q: H
* author        : Rill
+ M4 s, Y* v! R8 G0 @6 a, P* date                : 2013-08-11
/ v2 h* F( J8 J$ ~- T*( l( _8 C& |  w$ D0 a% q
*/: q! O1 N( D6 \$ q7 F

- g1 }' r6 C' B& N- p  l
) c/ i8 A( k) D1 D4 u7 ^; q5 e 3 T. e/ A. t. S% T
module regfile_mux# F- R9 s$ P) u( k$ E6 Q
(
7 p) @" A9 E. E( ~9 |/ Ginput insel,
7 |4 E7 O% C: m7 D0 |" l( Yinput selk,
$ k$ L6 T  y/ G4 k9 `/ R4 B# w4 Tinput [7:0] shiftout,
- R1 L7 t, r0 m0 Y" b! g0 @8 u( Oinput [7:0] kte,6 \4 V/ O; L. V
input [7:0] data_in,) N; d. _! M; l3 h/ s
0 @2 d; X* o* Y! H4 p
output [7:0] regmux3 ]8 \; a" w' q4 I/ u4 Y7 }. n
);
; P! r, n  N* l( R 7 P* D' i1 a. p, p; B9 H# T5 ?0 P- `9 o
wire [7:0] muxkte;
8 K7 f  m7 `; o0 S4 t% k* c/ B / E7 Z( Y# v8 A! O
assign regmux=insel? shiftout : muxkte;; u" {! X  `0 ^. h% O
assign muxkte=selk? kte : data_in;) W* {- P2 [# L3 f7 n- p" f9 g
! ^; [. P8 G& u4 ]6 ?  A
) r4 s+ J1 f9 T9 Y4 O* u4 s
endmodule
- r; s9 p4 Z' `
& i7 m" t3 u4 q2 Z) j, U; ]( h1 l9 H3 }: l# g$ J5 y% A
/*
) [) H5 o' n. c, X' k9 H*
/ ~* m& I8 u0 F7 N* file name        : regfile.v7 f4 g+ {2 P* P- K8 c( @
* author        : Rill
1 S8 h) {- _: N6 f. j* _" W6 U' o* date                : 2013-08-11
5 B6 z# `- p2 X! q. x*
* t, \5 L) k/ @; O*/4 F. S7 K' \4 n, b6 P8 f3 S
; |: S$ V. c% p; j3 s4 j: o$ S! n

5 F! K) ?) S" }1 x- p5 Y
, [, g2 ?; f6 a+ Q1 r5 J1 M# ]module regfile(
9 P! c6 x0 D1 K) ^& v' l, `5 `    input [7:0] datain,7 `0 F+ l8 z; T
    input clk, we,
' H7 _* q9 X* g( u$ j" S    input [2:0] wa,
* [2 a8 V1 t% k; j1 G    input [2:0] raa,0 D* C8 N: W+ n. w, z# i
    input [2:0] rab,1 Q8 j' H( V/ k: F; P  R0 H: y
    output [7:0] porta,9 k/ W3 G+ E* D( D6 C3 L
    output [7:0] portb# v- a4 F5 b- j/ {* Y
    );) J3 o! x1 D7 W0 K: _
  j% d$ K0 Z( _. e' {) C0 @
" s+ B# Y$ H" O, X
reg [7:0] mem [7:0];//r0 ~r255
; `& Z0 l- E, q4 U0 ~5 T3 ?8 I ' p3 ?& L$ n: c0 n
always@(posedge clk)
1 O; h; ]; X) ]4 W9 h' F6 bbegin' Q# l5 a. W* {' ^. B" d, x, N$ e
        mem[0]<=0;//r0 always is 02 x5 w/ a4 y2 ~2 c2 {+ W2 ^! D/ y+ q
               
/ u7 i5 U. X! `3 W' }! c* Z        if(we)  i" k+ M5 I3 f  i$ n: N. c
                mem[wa]<=datain;; G7 [( N9 Z! E& a- z
end       
$ s. _' f+ g7 U+ c        ( h- E2 A" s& ^0 }* W7 m( O* v# s
assign porta=mem[raa];
/ x! ?6 G  _; I0 ?( l6 }assign portb=mem[rab];7 H9 {- E1 x) f- ?5 e" L
* \7 N+ O% t: c
# `* ]: c0 D+ e9 k7 j
endmodule7 m; l+ z8 V* c! A) Z

3 o6 T, P1 `) q1 b" Z9 Q
2 |7 K4 c% r) l7 w- R' {11>栈:stack
  Q( d' G! }* G, N$ e' o9 u! L$ ~7 r5 G4 |6 w  `* w
# i- A2 q* C$ \" o6 C7 U

8 x' d0 [% z# ~  ~% S/*4 l- m9 o/ l  M/ U6 ?0 w$ Z- R7 x1 Q# i
*
* Q+ E  l3 {. C9 H& I3 U* file name        : stack.v8 h9 m% [% ~& J& a! Q) H9 V
* author        : Rill
; k) ]9 _1 H; o$ O$ `. O" N  s* date                : 2013-08-11' B  I6 `8 R8 w- t* `& L0 y
*3 f! F+ n. [, j- s1 g& b  z; L
*/
( V' m' p% I" S$ x9 B8 H " d; s& D6 `& C8 h) e& l9 j
( w* B( r' E  g# |7 v, m

' g7 l6 C. x7 B, D" J' E9 P) j& W+ {module stack(& P1 f- S9 C4 e/ f7 ]
    input clk,/ z, Y$ T# B8 P0 l% e* N6 y' ~
        input rst,% J, s3 c; A# T
    input wr_en,
1 u1 Y# t2 n7 s! b$ o( h5 }! e    input rd_en,
9 q( P2 ?: ?3 c1 v# h) S0 a, t    input [10:0] din,
- G! V& X( V% @1 T    output [10:0] dout
4 p1 w* f+ ?+ b/ r# D    );
$ x& L6 w/ F/ I" q+ i
: Y1 ~- P+ F- W1 s. [+ G9 W+ K " |+ s" C' g+ q  B
   (* RAM_STYLE="DISTRIBUTED" *)& Y. s, b% W( S, |5 \. G3 n
reg [3:0] addr;
4 K, H3 p. G( ?& greg [10:0] ram [15:0];: T  U* w/ ~" p  W) ]& z4 C

% M, t; Z8 Z. Y" g, |$ uassign dout = ram[addr] +1;
" K! b. t1 u/ w' _2 `* @0 w $ h* x6 I6 L6 C; V" q9 g
always@(posedge clk): }) n& d  N* c+ N2 \
begin. ~# v5 L  l; S  c- ^# ~$ a! L) v
        if (rst). E- R. J8 Q; V& g; L# H* k) K
                addr<=0;
" ~; _, q6 C" D) ]# i* q- w9 ^        else
8 K7 K* {2 h% g3 N* L) f                begin 2 C: A; T+ a5 ^: M. G( _
                        if (wr_en==0 && rd_en==1)  //leer
; a; X+ J6 |, j. ^                                if (addr>0): q: a" j5 u4 n1 _3 b
                                        addr<=addr-1;
0 [" G9 n9 n) d9 o( d4 h4 D                        if (wr_en==1 && rd_en==0)  //guardar1 H; w4 Y0 k# }/ s3 o+ D
                                if (addr<15)
+ p5 N2 c3 z# E0 b3 @                                        addr<=addr+1;* \4 h: o  D( g0 S
                end
7 G, m, r6 Z% ^& ~' c* P0 I9 Wend
  D  t4 ~* u/ H7 c2 |$ R                ! h' t2 r$ k% Y0 z
always @(posedge clk)
% K; ]. b# J( e$ O' Z0 g) Wbegin
% b: |* x3 R' @& g0 v$ U9 h        if (wr_en)
. I- O  Y3 r) ?2 O4 X                ram[addr] <= din;
- c' T3 U- C! O# A3 Jend5 d# }/ r* L5 [( y

( C' l: w, @. {9 H8 }endmodule7 a6 c7 ?: }- |7 G% N6 v% R
# J9 L( X+ X5 z# w2 s& o" o9 V

6 B4 _( A( C& L! X& y" V& O0 V2 v: E5,modelsim仿真
) Y) V: J, k% [, p0 R; D1>编写testbench
6 D& q8 X' b5 N3 |要进行仿真,需要编写对应的testbench,由于咱们这个cpu很简单,所以测试激励也很简单,代码如下:5 y# N: \+ U. s& o1 n) C, X

4 _+ E9 m) X' N$ d" J4 ~; W) B
' R/ i) m2 |, B# i1 {. \" I  I
" A$ |" `0 _" u8 F$ \! D/*6 l  |& p0 l7 O( i4 [4 h8 W
*1 [6 {% F, G9 R. }, n- N; q% |
* file name        : tiny_soc_tb.v% Q2 |0 F  D9 f1 s. B7 M: e3 `! |% ]
* atthor        : Rill
% L2 A3 E' e/ }9 X/ G* date                : 2013-08-11
+ Y# e$ i4 I  \! C" B*: Q! X$ @: k2 T/ t; ~. L
*/2 G' G( D" A* {; o
6 g" ^: u$ m3 v' T
`timescale 1ns / 1ps
1 r: T; n- P% q% |' `% ?  W6 x  n , @' ]9 r6 q& q. @2 L1 o
module tiny_soc_tb;
  a4 \1 ~! G  H" h9 z; L
2 q7 u  [0 U, ^( Z4 [5 V   x4 G8 x6 D  d% b8 K9 a/ y! g
reg clk;
# r; m, q( P( \8 f1 ^% Greg rst;
5 D1 f- M  [$ C - P; d# M2 ~8 \7 y

7 h' w/ I. R/ C! t) b9 talways #5 clk = ~clk;# n* P; s2 l& ~/ I" }: t
! L5 A) l$ z) M& |) i4 q" D
initial* e  o5 B2 N( o( O
begin! C. Y$ y9 a' f6 Y" h. z
        #0 0 i3 O# Z- q% p& D3 m
                clk = 0;
& s( h& q, `$ v  e                rst = 0;* _6 h( F* q4 g4 l+ ]! w8 _1 P
        #15 6 c3 F. u6 D( S6 A
                rst = 1;
( J" y( U1 ~+ I- H        #10
9 M* n" ]. x% }) q) k4 |                rst = 0;
: q2 d7 X$ K0 o5 Q7 E( M% j) H, R               
" l5 O' K- F# Y/ f) }( W        #1000
7 v1 B( V, P/ ~* C9 m6 c                $stop;$ D# p* h8 ^) y8 R% G
end
. j! e) `' B1 W; v
/ P/ b! @9 E. u! ssoc_top soc_top
. _2 z  H2 I; W0 F. j. O(
: j7 {+ B' o, U% W/ ~0 y8 p& d1 n.clk (clk),
& \. t3 }" i* _.rst (rst)
' S- {. _5 s/ V" U+ r& g' f# I+ Q);
1 I, B1 |7 ~% W: `
" Q' F5 x! p* W/ F$ M+ j / i" M4 K) }; W
endmodule# E7 D% L# F2 t2 T: V( A0 L
5 `2 o3 u% v1 g
; q- }5 H* d- v% _3 K
2>编写汇编代码及手动汇编
% m4 y5 y2 y# W& S当然还要编写其汇编代码,如下:
9 N, {7 s; K2 I# X/ u) G4 X. }3 _' @
6 S. G' s* |. v2 y

* o' K  l/ B4 K- [  v9 y" ?& V3 r# ^& S& ^/ X) T2 j
+ H' R9 O! a' z
然后我们要手动汇编成机器码,指令集都是自己定义的,所以是没有现成的compiler,只能手动汇编了,还好手动汇编要比手动反汇编轻松多了(之前,我们手动反汇编过OpenRISC的启动代码)。
: |* w  n6 G0 E* J
5 T( i; y  X' q9 i* I1 |汇编完成后,我们将机器码放到指令存储器里,如下,共七条指令。% \2 c0 E+ n1 c- }# x, {1 Q
8 d& P# N7 R% }  d) ?- V+ W- b1 @) D
% s; d9 Q9 Y5 ^9 y* O7 R
. z9 t* j7 f; x7 g  j0 B4 c
/ }6 G$ n0 [! @& m
6 z2 r( v! _3 `7 C5 g1 y  V
% x$ a3 y) [4 I: g# A
3>仿真结果2 U/ t. X8 G& o) U& I
完成上面的工作之后,我们就可以用仿真工具进行仿真了,下面是我用modelsim仿真的结果。
& A8 v  X0 |7 I" b* G$ u  m9 l  V9 P, C: D. N
从波形可以清晰的看出七条指令的执行过程。在运算完成后拉高write_e信号并将1+2的运算结果3写到了ram地址是55(0x37)的地方。3 p& ?% N) C% \# |. W
) L) n, l9 c! p
" L6 H( f9 U1 c+ C9 Y
9 h' @2 e8 q  N$ `

6 S( x9 A$ X% {2 B" I% C; U" v% N. V5 N2 d# b
" m9 |' x7 E$ w
4>代码仿真覆盖率! T/ A2 ~5 f3 W
由于这个测试汇编代码很短,我们有必要了解一下这个仿真激励运行过程中到底测试了多少代码,下面是code coverage报告截图。
1 x( n, a* R+ l+ {5 j8 w
7 i' V* d3 \" T* C' w

6 M, X' G$ r, F/ B' q% k需要说明的是上面的截图并不完整,下面是完整的代码覆盖率报告。( v! f6 O+ q6 C) x; [0 n' y" I

, O( e( C; y3 p
" v+ W) t. J1 v3 o. \0 [
& Q- k& \0 g2 g, H7 V1 K6 kCoverage Report Summary Data by file
  n: A4 E. A5 x6 y% j# G: s  b9 D( s( l : c' t0 L2 e" @* N1 r* W
File: E:/work/tiny_soc/bench/tiny_soc_tb.v
) {+ n5 b! a, D1 R8 I! ~" W- \: n    Enabled Coverage        Active      Hits % Covered
* ^4 D$ v4 }3 r" [$ B) D# d; A1 u    ----------------        ------      ---- ---------
' i- B6 H. y5 @    Stmts                       11        11     100.08 W! Z2 C& i  J) O8 ^7 `
    Branches                     0         0     100.0
/ s; w9 d4 g3 _) C! F6 U5 [! c    Conditions                   0         0     100.0: K. |$ D& U" U6 D
    Fec Conditions               0         0     100.0- S) ^3 Q/ B! J8 ~: v% a4 t' C2 G
    Expressions                  0         0     100.0
' M; {  d+ ?% j% K7 F) @8 B8 p5 h! H    Fec Expressions              0         0     100.0
1 b, a8 k0 A( [  g4 Y+ E* ^
8 X4 w7 ]& ~/ g3 M, E8 C8 MFile: E:/work/tiny_soc/rtl/core/alu.v( Y3 j1 W0 q+ Y6 X! ~
    Enabled Coverage        Active      Hits % Covered# u4 U8 A" m5 [' t" p4 J
    ----------------        ------      ---- ---------/ W  J  @2 j4 d9 [1 k
    Stmts                       20         7      35.0. R1 Q9 E$ _! M  p7 k( f6 T! R
    Branches                    16         3      18.72 w( g$ D4 T4 \3 x1 {5 |
    Conditions                   0         0     100.09 G) S6 X; ?- U6 L2 R4 x0 [
    Fec Conditions               0         0     100.0' H2 \3 G! B: H% j, E: ?9 \
    Expressions                  8         2      25.05 ]4 O+ Z, K, m+ j5 U( K
    Fec Expressions              8         2      25.0
/ s- W: e" t  K  G% M
: e) ]2 @& b' E4 T2 z. HFile: E:/work/tiny_soc/rtl/core/alu_mux.v; p" P% X7 \' X; o0 f
    Enabled Coverage        Active      Hits % Covered0 o0 G, X% C9 K/ \
    ----------------        ------      ---- ---------
. T/ Z1 [  S" g' u* s$ R& j    Stmts                        1         1     100.0) _8 |' w" f  y$ h7 W5 n
    Branches                     2         1      50.08 L9 k0 _, [7 R! }
    Conditions                   0         0     100.0
0 c8 U4 {. z0 t& q- w( ~/ d    Fec Conditions               0         0     100.0
7 q& e5 I/ x; v    Expressions                  0         0     100.0, a  E7 S# Y! X# H: \. y2 L; [
    Fec Expressions              0         0     100.0+ ^: q" X% I* I! ?. v4 g
" v6 O: `' O* O: M1 I
File: E:/work/tiny_soc/rtl/core/control_path.v
  E, a" z: \1 D6 z# }    Enabled Coverage        Active      Hits % Covered
8 P# j0 d8 r% n& {# \4 @/ N# ~6 e    ----------------        ------      ---- ---------
) W8 e+ z9 Q' `0 H6 T' g2 Z4 B' E    Stmts                      160        48      30.0
: G6 J) d4 Y. N$ ^" q) Q+ c0 u5 |    Branches                    60        18      30.0  d' W/ N' y6 ~! D& |- B* a/ S
    Conditions                   3         1      33.32 N. V, M# ^5 A. b1 h
    Fec Conditions               4         2      50.0# }' l% V* A( j3 E% |
    Expressions                  0         0     100.03 I8 c" ]1 e* v! w- M% P
    Fec Expressions              0         0     100.0
, H. J  v! A& O1 g
9 u7 ?) {0 _1 {4 K' g6 l5 TFile: E:/work/tiny_soc/rtl/core/genpc.v) C  O$ b' O3 g$ T9 l# Z
    Enabled Coverage        Active      Hits % Covered
% q% Y* ]' Z2 d0 D% P    ----------------        ------      ---- ---------
) M/ E- [. ?4 N$ l" y    Stmts                        4         4     100.0
& ]+ r: K  k! m7 A, ]. o2 T    Branches                     6         6     100.05 ^8 I( U  z# S1 [& {  C) ^# }7 Z2 a/ j
    Conditions                   0         0     100.0
- e( M$ p, Y' I  l% z* C5 P    Fec Conditions               0         0     100.0# m, E- k; z+ E- M' [) k4 w
    Expressions                  0         0     100.01 a2 T0 b; I6 N# U! S( I) m" G
    Fec Expressions              0         0     100.0( M$ N* j/ j" d0 E% q9 u

$ F( s9 X3 }" M3 \4 ^- TFile: E:/work/tiny_soc/rtl/core/regfile.v
2 E1 D4 S5 I% M9 z    Enabled Coverage        Active      Hits % Covered
$ E# @0 p7 l2 |: [9 i$ S/ y, I    ----------------        ------      ---- ---------% d+ S/ [4 X1 p: w
    Stmts                        4         4     100.08 t! k$ }7 ?0 G& ?/ [
    Branches                     2         2     100.0# ^* w3 }8 o* K* e
    Conditions                   0         0     100.03 k! _7 G- X* C7 Q$ W3 X% u3 P
    Fec Conditions               0         0     100.0
6 G  q9 r# o3 ^5 f! @    Expressions                  0         0     100.06 u. B6 k, r: N3 }
    Fec Expressions              0         0     100.0
( Y( B" @: a& {$ Q4 ?2 g ! z% O+ Q$ h  o; Y9 ?
File: E:/work/tiny_soc/rtl/core/regfile_mux.v
4 p; [2 q/ K/ e- ]8 ~9 G& ?7 d    Enabled Coverage        Active      Hits % Covered
/ e6 J" d7 E% f9 z& i0 w* i2 p    ----------------        ------      ---- ---------3 V+ O; m3 A4 j# F6 u$ e
    Stmts                        1         1     100.0
: w; H, x9 r' f    Branches                     4         4     100.0
0 y* u7 E, w3 D  L  d6 y  I    Conditions                   0         0     100.0
2 ?" s# k/ J% b! G4 s; I" w    Fec Conditions               0         0     100.07 Z) D7 b; P' r! ^
    Expressions                  0         0     100.0
( z$ r# X5 a2 J4 f/ a1 y. N2 s5 `( I    Fec Expressions              0         0     100.0/ u% B8 c) `1 X9 e

* ~: U5 i9 e1 G) rFile: E:/work/tiny_soc/rtl/core/stack.v
6 C( J& F7 }+ v! p' r    Enabled Coverage        Active      Hits % Covered2 G3 n+ `- ^6 v8 m# I
    ----------------        ------      ---- ---------: }+ E3 A, I( e% Y9 F$ V' ]
    Stmts                        7         4      57.1
$ k8 z, y- ]- p7 X+ E6 a  ^0 k    Branches                    12         5      41.6( ~4 g* L6 ~; S0 Z. l
    Conditions                   6         2      33.3# O: r2 l1 @- y* g
    Fec Conditions               8         2      25.0
# c3 w: q8 |; G+ x# l    Expressions                  0         0     100.0
* p$ F. F# O* ^* D4 K    Fec Expressions              0         0     100.0, v' @* s3 m7 x5 n

" ^+ b4 n- U* S: tFile: E:/work/tiny_soc/rtl/insn_rom.v
- ?& w& W0 y) I) T7 n# N/ N    Enabled Coverage        Active      Hits % Covered
; b1 X4 t. I* s    ----------------        ------      ---- ---------1 c& `, p* i( H; {4 k. l; o0 ^3 V
    Stmts                        9         9     100.03 S& l$ o  K! w: s* [: m. Q
    Branches                     2         2     100.0: \% J5 ^, O% L, f# q! B
    Conditions                   0         0     100.0" L; o, B- w1 j. Z( k( z. S) I* I
    Fec Conditions               0         0     100.09 n& j/ `4 Y8 f$ j
    Expressions                  0         0     100.0
  o9 B6 I6 Y2 H5 V0 G* ?    Fec Expressions              0         0     100.0
# W8 d; |5 r3 { 5 U- K6 `* z: v" y( D
File: E:/work/tiny_soc/rtl/ram.v0 n4 j, ~' Z9 u0 g
    Enabled Coverage        Active      Hits % Covered
/ x- B- ?' W  P. l( L2 M    ----------------        ------      ---- ---------1 q$ g7 `3 o% S) M. J
    Stmts                        9         8      88.80 x5 V# s# {7 c  K
    Branches                     6         5      83.3
) I" H: T. `/ N- M    Conditions                   0         0     100.0  g! @! [7 C0 ~4 W0 Z
    Fec Conditions               0         0     100.0
: p3 y/ R8 C# y' e0 x& c/ K    Expressions                  0         0     100.0: Q  i; X2 @5 v
    Fec Expressions              0         0     100.0) m3 X& B" }* k: h* i/ z
4 `/ D+ M* r& t. J' L
8 A- n* J' t( v0 m: W5 J* g
5 L2 ~( F  A7 Z; C6 e, u. }
+ E+ W6 c/ p1 P# Q
+ ]5 |. ~) ~# X# Z( P+ N. s* r

/ x; r! J( g, j. x( u6,综合
* |* M7 ~) Z& r; a4 |- d完成了仿真之后,我们就可以综合一下,在FPGA上验证了,下面是我用quartusII 12.0综合的结果。
4 @. |5 j8 @5 N. P4 Z; d8 t8 q8 ?
8 l% \& M/ w/ c& C" [( {2 r! Y
% u- o+ `( F. Q5 W% v1 F$ f; u* P/ u+ D2 O' H+ `2 u' g
soc_top模块:
$ c) A7 v, v, B( S1 U) ?9 e) F! V( R1 Z+ X5 l4 v

0 P1 ^3 ]3 ?$ s; M! f1 B- Z8 I7 H( ]* B# o, z; B

2 _# y; r. ~  a7 n. hcore模块:
# H, H/ F/ _% g9 g$ t
$ R- ^) H- ]/ G9 `

$ a; i& X7 U+ ]7 t7 m# A! F  p/ e' F* U9 L' ~

$ Q# H; B. d0 ~/ k& ?3 a" vdata_path模块:
6 ?! J7 X7 ]* M- b  @: F$ l1 f" }! g0 Y
7 I' h6 t2 S; C) A
0 Q; N, m# p/ C" J1 ~3 j  B( S. J
2 J5 B% a) K! H* \: J( k, ]& G
4 l8 Z# o! \- N: S

, w2 X' v) L. K+ K+ O# i% }# D0 F9 `2 M' k
7,改进及优化
; A9 ^6 O* |" L; Y3 ]9 X" \咱们设计现在这个小cpu core的目的是为了学习,在于了解cpu内部的运行机制,与软件的交互过程,没有考虑性能,功耗,面积等问题。
/ z, \; V$ R( A2 s& s& N' l8 ]5 i9 a
下面,我给出了采用五级流水的数据通路的模块划分和接口定义,如下所示,感兴趣的兄弟可以试着实现她。
0 q1 a" L5 U$ |& {
* J; x1 J" y8 Y2 s: X7 S
" A& F! e' p: e2 h" V" ^' j
; U4 [; j* m+ \, a: e1 v' t
; L3 p( N! o- S" P
% N5 q) u! K# w3 E, h

9 m: A* V) F) R+ v; O# V8,future work( X- ?! W9 L' A9 c, t4 M* K$ f# t
1,pipeline,将core流水化5 `+ ?& T( W, v" D6 c2 A5 m
6 x2 h7 Q/ M# O1 L- u& G% t* Q5 j
2,增加乘法,除法指令。咱们前面介绍过4-bit乘法器和除法器的设计:http://blog.csdn.net/rill_zhen/article/details/97001554 w  y7 p7 t; P

' R% _( I% R, |: I  F7 I1 `3,fix bug
$ [6 I" `; h5 Z9 I
5 ?+ i0 G& O* X  `0 S4,设计tiny_core的assembler,这样就不用手动汇编了。
0 [2 O, P  ?5 @  m" {
. E% C! U$ s" l" J( K% D: i1 o9,小结
( F; @/ D& u! j4 I本小节,我们试着设计了一个简单的cpu,并编写了可综合的外部基本模块和不可综合的测试激励模块,然后用quartusII进行了综合,最后还给出了优化后的数据通路结构。
: s6 [8 M/ b" n
2 j9 V& a3 N& ~% A, g/ V我想,通过本小节的内容,应该对cpu的工作机制和软件与硬件的关系有了更深入的感觉了。
% ?, x6 h  C3 Z) ?" C9 c0 z
' n2 w' U. D# b# {$ e, S- R需要说明的是,我的水平有限,再加上时间很短(两周),所以这里面肯定还有很多问题,和需要改进的地方,如果感兴趣,可以把代码down下来,先用modelsim仿真一下,然后再写个I/O controller,比如uart的控制器,挂到数据总线上,如果PC机能收到tiny_soc发出的“hello world”,那是多么令人激动的一件事情啊。/ i5 t4 a4 W( c6 E# E& t4 L

4 ]( K, _7 V7 |0 \# N5 q, z% {
; j! `; I. ?# W5 l; ^( S
附录:tiny_core的指令集0 o# J, ^9 f% ^' r7 h
说明:! {+ @0 t. b. a7 Y  p6 m# b+ i# D; j

6 B5 G! j; g& ^3 Z5 trrr:代表寄存器。
+ v: b6 b4 `' n  d+ C  t2 A+ V2 L" h; |1 I8 q0 r- l; K. m
aaa和bbb分别代表寄存器A和寄存器B,其中寄存器A是目的寄存器。+ Q4 V% v, {( L

/ V2 w; G( c* U& ]: [* t# Oiiiiiiii:代表8-bit的立即数。
6 K4 Z% s; ]7 l9 ?7 Y  g8 g- E* b3 x* R) i5 B7 f8 j' P1 N2 t2 }
xxx:代表忽略。, H( h1 f) `* n# o5 n
, O9 M- I/ `6 c2 x8 W( J1 E+ n9 O
ttt:11 bit的跳转/分支地址。
. Z5 f" T6 U( a+ k( ]7 ?/ C; L9 W0 A0 l. H1 n! N, f0 A+ e3 k" }% K

  v5 k1 {, y7 R( I) `' R
5 X) @3 a; {; K8 Q$ t2 j# O. [& E此外,这个指令集其实很早就开始弄了,最早是去年上半年开始的,现在是最新版本。+ N2 {5 H( @, A3 M& V
9 W" t6 T! ~" u/ Y2 _# i

9 a3 O1 n( g& `  W8 l8 j. {! L
; z" l2 r, ]- z' P% q* b* ]/ X6 O6 x* S6 z9 I6 q' H
% z  a1 Q2 z. ^7 I3 {

0 B$ S7 j! S8 l0 Y) U, J- |' `+ ?$ [% Y( }0 \

7 h$ w9 u6 n& B+ p# I/ ]0 a

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-26 02:00 , Processed in 0.281250 second(s), 26 queries , Gzip On.

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

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

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