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