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