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

#技术风云榜#基于ORPSoC对linux进行RTL仿真

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 ANkeer 于 2020-11-11 14:32 编辑   V7 D9 Z% o9 l! Y: Z4 e
; t8 y( }! |6 O
本小节,我们将实现在ML501平台上对linux进行RTL仿真。5 J# }& {0 P# u2 n$ S2 z; @3 O
3 @0 x, I- {8 C. P  E
1,DDR2仿真模型的修改
1 v8 F4 q3 c8 L2 \) d针对ML501的ORPSoC工程中,默认配置的DDR2的仿真模型与实际板子上使用的DDR2 SDRAM的参数不一致,我们要进行修改。4 n& _6 F/ ]( c+ d8 `4 ]

7 i' g6 k1 b1 D0 F7 {! Z. {# D7 E/ ba,实际内存参数2 ~1 l5 F. l! \; h; X
要想对DDR2 SDRAM的仿真模型进行修改,我们首先要弄明白几个概念。
: U% G: Z& q2 w5 w/ I. L( J- d+ i  K" b- E1 l* k) {' ]# m7 c
RANK,BANK,row,,column。这几个都是逻辑上的概念。, `$ P+ z8 S/ W8 g& N+ o) e

" V" C, X9 s( D; a此外还有channel,module,chip,device等物理上的概念。
1 n! r8 m2 e: y* J6 n6 O' {* N! `* R4 i  T
对于ML501使用的DDR2 SDRAM来说,其具体参数如下所示:# m. s7 d* K. m
( g: x/ H% s3 }- Q, i
通过查看内存条,我们可以看到如下内容:MT4HTF3264HY-667F1     1RX16  256MB PC-5300S,& i$ o" K( q6 s. E

6 X, f% W- p: {% K1 @4 q" E+ m其中3263是指内存条的organization:32Megx64,x64表示整个内存条的数据线(DQ)宽度是64bit。9 s1 F. g, E0 B+ z7 O" {

' m! Z. R/ B. Q5 Q" u: u5 `' y667表示内存条的speed grade。PC-5300也是speed grade。0 |: H* p6 T  q# r
( C/ a. [3 y) {2 N% x
1RX16表示内存条上面的4个device,每个数据宽度是16,16X4正好是64bit。
! g# c4 J* s2 W. D% |7 B" G- a8 a. g8 x) B" ~4 B4 u$ y
256MB,毫无疑问,表示内存条的容量是256M bytes。! f& y2 B" q0 q- O* `3 ~) ?
- @' C* A* V- g) _7 k& w! H
通过内存条上面的标示,我们就可以获得很多信息,此外,通过查看其数据手册,我们会得到更详细的参数:1 h7 G% ~3 q3 @
) \  R9 U: C% H) l9 |! J  [4 u
" ]) K- v* N8 g1 ]. |7 P- @" n  _

! U! y$ v! J) ~8 A; h3 b5 G/ I, l
- g- ], _6 P5 B0 ~# k+ O1 m* h( R: Z9 F2 n  e6 U0 Y
RANK:是single rank。2 t! u% t# X1 b
$ f) }6 r0 t8 ~
BANK:BA是2bit,说明bank数量是4,每个bank的大小是256MB/4=64MB。
1 z$ c1 A* j$ ]& J, ^/ A1 P
4 w" t2 m- @9 Y% x# u- Frow:宽度是[12:0],一共13bit。
9 {8 p" w8 _* X0 _6 V# }3 Y# a
  S+ B- ^) ]; V8 E/ ~; Hcolumn:宽度是[9:0],一共10bit。
* o9 [4 }. {9 [) t& o  G2 N& q% ^* ~& {" \$ c" D
; u  f1 A9 {9 o) w! p4 }9 p
b,仿真模型参数; f, Q9 E' b% n/ z
确定了我们实际使用的内存条的参数之后,我们就可以修改仿真模型的具体参数了。
4 `( a6 j9 p) [; \
8 h. y5 l( y5 Q3 |% ~9 B需要注意的是ddr2_model.v只是一个timing model,具体的storage,需要我们自己根据实际情况来定。2 ^2 c1 X/ M4 t7 s
2 K  E& o5 Y' i% E9 f; o+ y6 c" H1 j
这里需要修改的是MEM_BITS,由于ddr2_model.v是一个device的仿真模型,每个device中包含4个四分之一的bank,共64MB,所以对于如下定义:
) `/ n; ?/ A9 d" X1 a3 f' Y) a9 I9 H/ \
$ m4 C5 }* K7 }$ s- T! r

* P( s8 d3 f3 t1 v1 B! a# k    // Memory Storage) D$ J. B' @* d
`ifdef MAX_MEM/ J, M8 T& \) L1 w1 J
    reg     [BL_MAX*DQ_BITS-1:0] memory  [0:`MAX_SIZE-1];! s6 B; T$ c0 b7 d% p
`else//     [8      *  16   -1:0]        [0:(1<<22) -1]==>26bit==>64MB- e+ s$ l/ R! \+ l# B, v9 M4 \
    reg     [BL_MAX*DQ_BITS-1:0] memory  [0:`MEM_SIZE-1];: h# t' ?; ^. D
    reg     [`MAX_BITS-1:0]      address [0:`MEM_SIZE-1];
& A" J" t/ u% _# M    reg     [MEM_BITS:0]         memory_index;
! `1 w5 r5 P, {# ?7 J    reg     [MEM_BITS:0]         memory_used;
' u& F: ~6 S# w% w`endif
5 c% y+ t' n. Y9 A1 z" c/ W, h' J! K
我们需要定义MEM_BITS为22,如下所示:
# _9 K" x( t2 {" O9 ~3 u1 M8 l# \. T2 P' Q" y' K$ c
3 _+ i: K" X/ p9 E

3 [1 j- `- O& R6 Y/ s* v+ k
3 x/ u4 s" s5 d+ l6 A$ o完整的参数,如下所示:
# m% U5 V  c: r0 ~% c( ^
5 p) |2 n7 ?" v3 M1 ]7 t. t
& n6 ^( Z6 Y+ L5 H: i' Y9 P
8 l4 @2 G7 \" B! s1 L! G* {. a/****************************************************************************************
% M, l/ u3 o+ ]*$ ?! u9 b# l$ l: w6 q; d/ d. U
*   Disclaimer   This software code and all associated documentation, comments or other 1 x0 f0 N; N! G) Q5 m) ^
*  of Warranty:  information (collectively "Software") is provided "AS IS" without
& r- {8 @. p- }* n*                warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY . Q6 d* y* Q. D+ A+ t/ v
*                DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
2 V( M4 p) ^- ?; G*                TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES
9 r5 K# E* C7 F5 A6 ~% H, s2 \*                OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT 2 d7 Q* o! D: a
*                WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE $ @/ F- H3 T( V& t7 u% u# q: a
*                OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE. 1 K) t/ q+ r9 ^) ?" t% Y( c
*                FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR 9 W. s& ^- Z0 D5 K- A
*                THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS,
* j3 J+ Z* g* Z( N/ w( X*                ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE
  [9 d: Z+ D, g- ]*                OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI, 5 {6 V  X! z+ ?; D& W0 R
*                ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT, 3 m$ y: J6 G; a/ G$ ^1 D  |
*                INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING, & B' h' M8 m! C/ P/ N
*                WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, - o4 f" k5 w7 o- P' b+ r8 G
*                OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE " e0 T1 X! z. B4 V6 @4 c2 X
*                THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 7 o3 p" H1 l6 g  _1 S' j
*                DAMAGES. Because some jurisdictions prohibit the exclusion or 9 |- g. e/ g) k/ e% u: J
*                limitation of liability for consequential or incidental damages, the 9 y4 h. q, @  N# Z; F) l
*                above limitation may not apply to you.
% U/ L% Y" H  T, I# z1 o*3 I' a. D2 o& I' u6 _: w
*                Copyright 2003 Micron Technology, Inc. All rights reserved.7 c9 n* n* Q8 G) s/ E
*" }: Q8 L$ f9 a( f% v
****************************************************************************************/
, O# y6 J; n; h& `) h' M) Y . o3 a3 L( p) ~, f/ G( \
    // Parameters current with 512Mb datasheet rev N
% s4 `' z" l# }. y" N
% i( B% }6 S, L0 s# ?/ i& n    // Timing parameters based on Speed Grade
+ I4 \! V" u- f3 W; O1 ?$ e. r % K0 I( d8 d  B; t1 k+ G- K0 p) u
                                          // SYMBOL UNITS DESCRIPTION" b7 f* o8 N4 p* ^2 V( j* E0 q
`define sg37E
9 @, I3 }' H: `4 O) H( a3 o/ f`define x166 f& F( p$ V! Q! A+ `6 r
//`define MAX_MEM, a8 M" t' V# d$ U

4 N. P( e2 s" U+ R`ifdef sg37E
1 q( M$ X! V& Y, B7 n( @2 }& H! U    parameter TCK_MIN          =    3750; // tCK    ps    Minimum Clock Cycle Time! B, s! ^' N7 h9 q
    parameter TJIT_PER         =     125; // tJIT(per)  ps Period JItter
4 Z3 k! w; }$ U, v* Q    parameter TJIT_DUTY        =     125; // tJIT(duty) ps Half Period Jitter7 k' H2 L; N  Y
    parameter TJIT_CC          =     250; // tJIT(cc)   ps Cycle to Cycle jitter/ @. r; ^* _+ H" T* w& n
    parameter TERR_2PER        =     175; // tERR(nper) ps Accumulated Error (2-cycle)- E2 B+ r4 A& [+ r) i6 h
    parameter TERR_3PER        =     225; // tERR(nper) ps Accumulated Error (3-cycle)
; O, s6 v/ U; N    parameter TERR_4PER        =     250; // tERR(nper) ps Accumulated Error (4-cycle)- b3 ?8 ?8 S2 u* D$ L# k: T
    parameter TERR_5PER        =     250; // tERR(nper) ps Accumulated Error (5-cycle)
( J/ g% B. `. h0 V( s0 w) z0 J; ?    parameter TERR_N1PER       =     350; // tERR(nper) ps Accumulated Error (6-10-cycle)2 R0 m' F* ~9 a2 w
    parameter TERR_N2PER       =     450; // tERR(nper) ps Accumulated Error (11-50-cycle)
0 x" w# s( o8 S5 u) }3 y, i    parameter TQHS             =     400; // tQHS   ps    Data hold skew factor
$ W# @9 {" y& i" Y4 M5 c    parameter TAC              =     500; // tAC    ps    DQ output access time from CK/CK## z) t' N! A! i
    parameter TDS              =     100; // tDS    ps    DQ and DM input setup time relative to DQS/ w" `# ?0 M; U7 j4 G# r
    parameter TDH              =     225; // tDH    ps    DQ and DM input hold time relative to DQS5 N4 J  r! W9 ~1 ]: F; T) g3 M( o
    parameter TDQSCK           =     450; // tDQSCK ps    DQS output access time from CK/CK#
1 z# P8 q0 @$ I$ W    parameter TDQSQ            =     300; // tDQSQ  ps    DQS-DQ skew, DQS to last DQ valid, per group, per access
. \- ~, ?2 c6 v5 d' J    parameter TIS              =     250; // tIS    ps    Input Setup Time- U/ T; z" z$ R' r* W/ z
    parameter TIH              =     375; // tIH    ps    Input Hold Time3 l9 W3 S3 B% y& C/ r
    parameter TRC              =   55000; // tRC    ps    Active to Active/Auto Refresh command time
2 t# F% G5 F1 }1 j. g    parameter TRCD             =   15000; // tRCD   ps    Active to Read/Write command time
% ?: `7 {+ R- K    parameter TWTR             =    7500; // tWTR   ps    Write to Read command delay% K- ]( x% o0 |2 g. l% R% V
    parameter TRP              =   15000; // tRP    ps    Precharge command period
& Z  ~" I4 n! ?# Q    parameter TRPA             =   15000; // tRPA   ps    Precharge All period
* x* }. \' L* B3 o  t) c    parameter TXARDS           =       6; // tXARDS tCK   Exit low power active power down to a read command
' _8 D3 h2 h  {  r$ @    parameter TXARD            =       2; // tXARD  tCK   Exit active power down to a read command
0 U( g$ b$ v1 y/ p* U) ?# u    parameter TXP              =       2; // tXP    tCK   Exit power down to a non-read command* ]( |, p1 |# w
    parameter TANPD            =       3; // tANPD  tCK   ODT to power-down entry latency
3 [4 L) X" ^4 G: B$ q3 m    parameter TAXPD            =       8; // tAXPD  tCK   ODT power-down exit latency
3 V( |) @( L; E: _! A    parameter CL_TIME          =   15000; // CL     ps    Minimum CAS Latency
: d3 n8 k* p  ~5 R`endif                                          // ------ ----- -----------
: _% r& c3 p4 X/ E2 [& }" R) z % ?' _# f! E  s# j  _4 {
# ?: a; c9 L! V
`ifdef x16
3 a1 r" b$ Q' {7 x! T  `ifdef sg37E7 A: I: |2 i* w% v+ x0 `
    parameter TFAW             =   50000; // tFAW  ps     Four Bank Activate window) x. q, S/ }* U+ S0 z
  `endif; X7 ^9 ~% o! a, d  B
`endif
* f. |! k0 J, g 0 L% [2 D- E3 q6 w  l+ Y8 n& {* w0 f
    // Timing Parameters
, S1 q; \( _. x: h7 a
# p- C# v, r7 A/ P2 n5 {    // Mode Register, P# f: {8 h) G2 m) p8 O
    parameter AL_MIN           =       0; // AL     tCK   Minimum Additive Latency
3 Y" {! `: A9 P. J  o3 m$ ~3 a    parameter AL_MAX           =       6; // AL     tCK   Maximum Additive Latency
, _- V0 ~  G( g  [. f    parameter CL_MIN           =       3; // CL     tCK   Minimum CAS Latency
$ @* I9 @! k6 B; @6 U, T" S    parameter CL_MAX           =       7; // CL     tCK   Maximum CAS Latency1 Y$ E* B; v' _+ G- N$ p" p5 N
    parameter WR_MIN           =       2; // WR     tCK   Minimum Write Recovery* c9 ?9 O4 O" g' W9 N+ A- g
    parameter WR_MAX           =       8; // WR     tCK   Maximum Write Recovery
5 }% t/ P  r+ S* C  }; x    parameter BL_MIN           =       4; // BL     tCK   Minimum Burst Length% B2 {; e9 ?  a& M
    parameter BL_MAX           =       8; // BL     tCK   Minimum Burst Length
. z. x, F9 g# J5 l1 H$ ]    // Clock
, F) E: l; _2 K5 ]8 Y    parameter TCK_MAX          =    8000; // tCK    ps    Maximum Clock Cycle Time
1 \/ w9 s5 u- U: C2 e: s6 `    parameter TCH_MIN          =    0.48; // tCH    tCK   Minimum Clock High-Level Pulse Width
0 ]! h$ ]/ K% @0 \; s- S/ A/ u    parameter TCH_MAX          =    0.52; // tCH    tCK   Maximum Clock High-Level Pulse Width+ v: }& @- v0 y, E
    parameter TCL_MIN          =    0.48; // tCL    tCK   Minimum Clock Low-Level Pulse Width7 c$ l5 z$ g! r. W
    parameter TCL_MAX          =    0.52; // tCL    tCK   Maximum Clock Low-Level Pulse Width
1 X+ m7 k6 ~4 p; n    // Data
& R9 @% z$ X0 N$ ]* J1 a    parameter TLZ              =     TAC; // tLZ    ps    Data-out low-impedance window from CK/CK#
6 R/ L/ H9 I* P, \5 j* M    parameter THZ              =     TAC; // tHZ    ps    Data-out high impedance window from CK/CK#
2 P3 m# C/ A- C! a3 E8 l$ o    parameter TDIPW            =    0.35; // tDIPW  tCK   DQ and DM input Pulse Width
2 D0 q8 \% h9 d2 u' ~) D5 Z    // Data Strobe( b+ u( u" x, m( p7 L
    parameter TDQSH            =    0.35; // tDQSH  tCK   DQS input High Pulse Width
2 V9 Y0 d" b) i$ p0 B    parameter TDQSL            =    0.35; // tDQSL  tCK   DQS input Low Pulse Width
0 L, m( V! M) [( d1 U5 d    parameter TDSS             =    0.20; // tDSS   tCK   DQS falling edge to CLK rising (setup time)
  L, `' U6 o/ l! U) P/ D    parameter TDSH             =    0.20; // tDSH   tCK   DQS falling edge from CLK rising (hold time)$ l; p" a. g2 }8 _8 J
    parameter TWPRE            =    0.35; // tWPRE  tCK   DQS Write Preamble
' _! M' D: u2 L/ r    parameter TWPST            =    0.40; // tWPST  tCK   DQS Write Postamble
' T+ V2 b/ x3 @( }7 A7 {8 v% S    parameter TDQSS            =    0.25; // tDQSS  tCK   Rising clock edge to DQS/DQS# latching transition/ [5 @" o: I# ^# D
    // Command and Address) D9 d6 G4 H. L$ [. V& P
    parameter TIPW             =     0.6; // tIPW   tCK   Control and Address input Pulse Width  ; t, ?9 e& }9 W1 @5 \
    parameter TCCD             =       2; // tCCD   tCK   Cas to Cas command delay9 J* H0 v( l9 W1 U/ L3 I9 i' r
    parameter TRAS_MIN         =   40000; // tRAS   ps    Minimum Active to Precharge command time
9 v: b/ I1 [5 a5 `    parameter TRAS_MAX         =70000000; // tRAS   ps    Maximum Active to Precharge command time1 F6 c1 u& Q& G& r4 X, C7 W
    parameter TRTP             =    7500; // tRTP   ps    Read to Precharge command delay  t! ?9 ~; s, G; m3 J3 s/ B
    parameter TWR              =   15000; // tWR    ps    Write recovery time% G3 \. a, V4 k/ p& t' g% W
    parameter TMRD             =       2; // tMRD   tCK   Load Mode Register command cycle time
6 s! B$ l3 m/ y# C( A; R    parameter TDLLK            =     200; // tDLLK  tCK   DLL locking time
7 P/ m+ Q. B# S  F; s    // Refresh
/ l( @- Y& I0 Z8 j9 n    parameter TRFC_MIN         =  105000; // tRFC   ps    Refresh to Refresh Command interval minimum value) V% V6 }1 S' O( ~
    parameter TRFC_MAX         =70000000; // tRFC   ps    Refresh to Refresh Command Interval maximum value
( m# D# {7 E* m' ~* X    // Self Refresh. T6 a- f/ }& s- D2 T
    parameter TXSNR   = TRFC_MIN + 10000; // tXSNR  ps    Exit self refesh to a non-read command
" i0 q6 M0 n7 n! n, l    parameter TXSRD            =     200; // tXSRD  tCK   Exit self refresh to a read command
3 S5 P! H  _3 F) b6 p' Z    parameter TISXR            =     TIS; // tISXR  ps    CKE setup time during self refresh exit.6 Y1 a1 y( k0 |) I. \
    // ODT
+ \  q* l# z+ a: W5 ?; s    parameter TAOND            =       2; // tAOND  tCK   ODT turn-on delay0 H$ f3 x$ f, P$ I  W
    parameter TAOFD            =     2.5; // tAOFD  tCK   ODT turn-off delay
& c4 g, L# n3 v# r    parameter TAONPD           =    2000; // tAONPD ps    ODT turn-on (precharge power-down mode)$ A! n$ i6 O& Y4 ]: k
    parameter TAOFPD           =    2000; // tAOFPD ps    ODT turn-off (precharge power-down mode)
8 [2 d) j& O7 F6 X0 u% M# `  J" c7 z    parameter TMOD             =   12000; // tMOD   ps    ODT enable in EMR to ODT pin transition
. v) T0 A9 B3 v    // Power Down
! S+ J6 E- Y6 l6 S# m    parameter TCKE             =       3; // tCKE   tCK   CKE minimum high or low pulse width
" F4 D0 x; F" D* S 7 \4 O5 x% I# {- C* J( L# o% s6 f
    // Size Parameters based on Part Width: Y3 ?5 |' N- L

  J! c3 i7 h" g8 O/ w- O`ifdef x16
" q4 H. S# ?7 V    parameter ADDR_BITS        =      13; // Address Bits
/ i& u; N8 X  E  }; e    parameter ROW_BITS         =      13; // Number of Address bits
  E+ ]+ z0 \$ _, P# N5 e    parameter COL_BITS         =      10; // Number of Column bits
8 b- u% T' Y' D' Z1 G( L; U    parameter DM_BITS          =       2; // Number of Data Mask bits
' C# D: a) Q" O( v8 x0 H3 k    parameter DQ_BITS          =      16; // Number of Data bits
/ H9 a1 e+ ~( \7 L2 p  |    parameter DQS_BITS         =       2; // Number of Dqs bits: S. ~' {; w; d& Z  q+ ~
    parameter TRRD             =   10000; // tRRD   Active bank a to Active bank b command time  d; C! I4 u* x
`endif! h1 \3 |5 x; S' g

5 V. x. |! M" k" }* x`ifdef QUAD_RANK
6 T5 ]1 x1 Q, i6 L8 T% k- V    `define DUAL_RANK // also define DUAL_RANK, }$ w% v- t" o1 ~( R' }0 S& }. z
    parameter CS_BITS          =       4; // Number of Chip Select Bits
8 b/ T" I. {% ^) P9 g) Y& o    parameter RANKS            =       4; // Number of Chip Select Bits
4 E: p+ C1 V. C) K* S2 u/ O) A* q* p`else `ifdef DUAL_RANK* N; q/ S. l+ g
    parameter CS_BITS          =       2; // Number of Chip Select Bits8 b8 I1 e8 a2 t% u. B
    parameter RANKS            =       2; // Number of Chip Select Bits. [. ]' j4 a, \$ b) L
`else& k( Q" T) X. s2 [' `9 ~6 q
    parameter CS_BITS          =       2; // Number of Chip Select Bits+ k- Z: {7 \5 F6 r
    parameter RANKS            =       1; // Number of Chip Select Bits9 I1 |7 M: ]& g
`endif `endif7 b% X5 J6 l$ d/ _7 U7 _# z
8 |9 [4 x8 n) n4 C  K; c
    // Size Parameters) X) B1 c+ V/ f
    parameter BA_BITS          =       2; // Set this pARMaeter to control how many Bank Address bits- G9 I- a2 c& o, F+ N. z
// if MEM_BITS== 14, a DQ=16 each part, DQ=64 total (4 parts) => 1MB total (256KB each)
( G7 b7 V% Q; Q7 b9 h& J* W9 ^+ _// if MEM_BITS== 15, a DQ=16 each part, DQ=64 total (4 parts) => 2MB total (512KB each)( C: c5 f2 H8 b
// if MEM_BITS== 16, a DQ=16 each part, DQ=64 total (4 parts) => 4MB total (1MB each)3 A7 @8 M4 e% ]  z/ r& I' p* x
// if MEM_BITS== 17, a DQ=16 each part, DQ=64 total (4 parts) => 8MB total (2MB each)2 a/ U& f8 ^8 g; W) @
//parameter MEM_BITS         =      14; // Number of write data bursts can be stored in memory.  The default is 2^10=1024.! B  N( Q( H3 C( }8 A* C
   parameter MEM_BITS         =      22; // Number of write data bursts can be stored in memory.  //256MB total(64MB each),Rill modify from 17 to 22 140410
) a6 Y9 A( W" ?    parameter AP               =      10; // the address bit that controls auto-precharge and precharge-all: n( k, U0 [* r6 s9 O6 w( n
    parameter BL_BITS          =       3; // the number of bits required to count to MAX_BL. d, |& v' w3 k- e8 C
    parameter BO_BITS          =       2; // the number of Burst Order Bits
9 o( w) a* l  B# V6 k% { : I2 _; n$ E3 A- @( @* f& D
    // Simulation parameters. d$ o+ |1 {9 t" d9 R5 Z" q
    parameter STOP_ON_ERROR    =       1; // If set to 1, the model will halt on command sequence/major errors
5 n( I% F- _1 Y    parameter DEBUG            =       0; // Turn on Debug messages
4 @. k+ U" o: J! r    parameter BUS_DELAY        =       0; // delay in nanoseconds
3 J. x; x5 D1 P. o0 p9 u    parameter RANDOM_OUT_DELAY =       0; // If set to 1, the model will put a random amount of delay on DQ/DQS during reads: I- V9 B9 A7 X- E) c. H
    parameter RANDOM_SEED      = 711689044; //seed value for random generator.4 S- Z4 f4 I3 H' F, F* \9 {
5 W1 r% E! x, ]
    parameter RDQSEN_PRE       =       2; // DQS driving time prior to first read strobe$ e( s% C8 t! [# F" f
    parameter RDQSEN_PST       =       1; // DQS driving time after last read strobe0 i# Q5 f% e/ @4 r( j
    parameter RDQS_PRE         =       2; // DQS low time prior to first read strobe2 E4 Y: b2 u' u3 R. m, j# n
    parameter RDQS_PST         =       1; // DQS low time after last valid read strobe
4 M5 x, {9 e+ Y, w$ x- p4 Z. y0 ^    parameter RDQEN_PRE        =       0; // DQ/DM driving time prior to first read data3 l- ^0 }, F! V# I2 p; T% U
    parameter RDQEN_PST        =       0; // DQ/DM driving time after last read data
6 [# W8 I6 Y; H* b( \& ^* h    parameter WDQS_PRE         =       1; // DQS half clock periods prior to first write strobe
; [; ?7 p0 ?4 y* G! z' i' U, N; Z. g    parameter WDQS_PST         =       1; // DQS half clock periods after last valid write strobe
' q) g# o) k( o- z% T* ^( ^& p; S% ^$ a4 D/ S/ u
  @4 ~2 Q/ F( l! h0 m: h# ?. O
c,preload的修改' P# |6 R+ n6 u  `! e
目前,我们已经建立的和实际硬件一致的仿真模型,但是我们在仿真前,要把linux的镜像实现load到仿真模型中才行,这就需要了解DDR2 SDRAM的内部组织结构,了解BL_MAX,BL_BITS,DQ_BITS等参数的具体含义,了解DDR2 SDRAM的读写过程和时序。这些内容请参考《memory system - cache dram disk》一书。这里不再赘述。) K" t, Y, N) D5 q! {4 `9 s

9 d7 O; F5 ?3 f5 ^8 s  c7 E% z对于仿真linux而言,由于编译时指定的内存大小是32MB,所以,我在preload时也只load32MB,一个bank是64MB,所以我们只需要load bank0即可,但是bank0是分布在4个device里的。
3 v! K- ?; H" Z/ n* ]* x6 I, g$ u! T5 ]& Z% z
下面是修改后的orpsoc_testbench.v的部分代码:
# K4 ~+ I, M  U$ U8 E6 }
3 o8 r* x# v) E2 }" N# r! H`ifdef XILINX_DDR2
$ P" B, ]$ D+ _ `ifndef GATE_SIM
$ f! T, p5 E0 @6 e   defparam dut.xilinx_ddr2_0.xilinx_ddr2_if0.ddr2_mig0.SIM_ONLY = 1;
3 i3 x+ A! w. m) e `endif
/ k, C2 C1 V" ?8 p& z
2 [, Z1 ]1 ^( m/ s* m5 f% J6 t   always @( * ) begin
0 r' B9 w+ ]- t/ Y$ ?      ddr2_ck_sdram        <=  #(TPROP_PCB_CTRL) ddr2_ck_FPGA;& V5 V& V& W$ i' u/ b
      ddr2_ck_n_sdram      <=  #(TPROP_PCB_CTRL) ddr2_ck_n_fpga;0 [) ~" H6 a: O/ x
      ddr2_a_sdram    <=  #(TPROP_PCB_CTRL) ddr2_a_fpga;' r. E0 w; b! _8 {! H0 a
      ddr2_ba_sdram         <=  #(TPROP_PCB_CTRL) ddr2_ba_fpga;! J0 n* H" c+ c; o2 t
      ddr2_ras_n_sdram      <=  #(TPROP_PCB_CTRL) ddr2_ras_n_fpga;
% {/ S6 U  {: v8 ^4 x9 T" M; t      ddr2_cas_n_sdram      <=  #(TPROP_PCB_CTRL) ddr2_cas_n_fpga;
& Q& U' Q( g. P' E/ d4 _; y  ^      ddr2_we_n_sdram       <=  #(TPROP_PCB_CTRL) ddr2_we_n_fpga;$ c4 e$ t/ S3 z% u5 U! X- \
      ddr2_cs_n_sdram       <=  #(TPROP_PCB_CTRL) ddr2_cs_n_fpga;
, |# o1 ^' G6 K- V+ ]2 E      ddr2_cke_sdram        <=  #(TPROP_PCB_CTRL) ddr2_cke_fpga;0 L! r7 T7 k, K& K0 H& F
      ddr2_odt_sdram        <=  #(TPROP_PCB_CTRL) ddr2_odt_fpga;
; ~  E) |( J6 a. g1 h1 ?      ddr2_dm_sdram_tmp     <=  #(TPROP_PCB_DATA) ddr2_dm_fpga;//DM signal generation
7 ]! Z& u; O0 r8 |% F   end // always @ ( * )
0 w8 s& _( N. Z0 _   
& h4 a9 u1 f3 P/ |   // Model delays on bi-directional BUS) g% _( L+ G. v! c2 G% e
   genvar dqwd;7 E' L& w; S: m; b& x; n0 |/ X' O
   generate
; }' `+ N; z. r( }# W  o      for (dqwd = 0;dqwd < DQ_WIDTH;dqwd = dqwd+1) begin : dq_delay# p2 U% P  R: b4 M, G
         wiredelay #
7 z; ^& X, @* V: c- O$ t2 F+ g           () S" b0 R' a. \3 G% Z- L
            .Delay_g     (TPROP_PCB_DATA),# w" Z4 k8 Z: U
            .Delay_rd    (TPROP_PCB_DATA_RD)& @! P3 [  a- P& H: H6 j
            ); D- ]6 z7 b! }% ^. g$ `# r
         u_delay_dq$ L- b8 z7 y$ k0 D
           (
# ?( f( C7 e( ?# D- b5 r! w# i% y; J            .A           (ddr2_dq_fpga[dqwd]),2 `! l; k# S/ C2 c
            .B           (ddr2_dq_sdram[dqwd]),5 v- |+ {7 [/ T- j5 h& S* ]% x
            .reset       (rst_n)* i0 S3 e/ S6 z: q0 C2 h
            );
1 X( {3 Q* v- ]7 V$ w9 H      end
, _7 @# v3 `8 J9 b   endgenerate8 u: F8 X' {- A. n
   " W( s# b7 N! v( V" ?
   genvar dqswd;& Z) T2 d$ m- d
   generate1 x' H. U5 ~' q# K1 v" z; Y
      for (dqswd = 0;dqswd < DQS_WIDTH;dqswd = dqswd+1) begin : dqs_delay
3 G4 F2 b$ A7 ]0 b  E. |1 U         wiredelay #
# q6 T* u7 z5 T" f  i8 H+ A           (. u9 Q# ^& u5 i
            .Delay_g     (TPROP_DQS),
% b9 K7 _. {$ o$ g            .Delay_rd    (TPROP_DQS_RD)
& f4 x* [1 i% A2 F5 ?* e7 R& z            )4 e/ h& m6 d  X2 o# A0 [: n
         u_delay_dqs9 J& O! v5 u/ Z6 |
           (
8 [1 M7 z4 H+ Z4 w3 m1 v            .A           (ddr2_dqs_fpga[dqswd]),
' }6 x6 n; \% _3 ~5 Z            .B           (ddr2_dqs_sdram[dqswd]),( J+ N1 u+ ?9 i) K! z/ E4 k6 z
            .reset       (rst_n)9 ]- K% d" Q) Z2 r$ x; `
            );
# `- t! R& f+ a8 ]  Z$ X6 t( [         6 N4 ~# Z  f, p) J2 s- R* {1 H9 N% d$ I
         wiredelay #3 r% }& J3 c( w8 c# \9 I7 ~
           (
' D! h6 j6 A' l. e            .Delay_g     (TPROP_DQS),8 \5 @5 H1 O) n
            .Delay_rd    (TPROP_DQS_RD)5 r& A8 l* j4 f
            )
& E3 C5 C6 w! p& F/ U         u_delay_dqs_n; c) F7 K7 C, P6 K0 Y0 {
           (
0 P# t) `/ C1 t+ Q) n6 b            .A           (ddr2_dqs_n_fpga[dqswd]),- J  z( G  s- b6 C
            .B           (ddr2_dqs_n_sdram[dqswd]),, n2 ~9 m  g- w" U, ^
            .reset       (rst_n)* n! e  ]4 Z( c2 r
            );) a3 Q3 v! E* l; j+ P! l
      end
$ s+ ]( R0 b5 i9 P, j* o% A   endgenerate
% P  w$ g; S: k* I   % T1 S5 d5 Y0 N) ]2 d
   assign ddr2_dm_sdram = ddr2_dm_sdram_tmp;6 k5 O& k6 L  v' O+ A+ l
   //parameter NUM_PROGRAM_WORDS=1048576;
+ u# s  c, N) I# H. M) Y, w$ nparameter NUM_PROGRAM_WORDS=8388608;   //Rill modify from 10485762 y! M6 ^+ J8 Z$ A; i
   integer ram_ptr, program_word_ptr, k;/ D# ^$ l5 H5 S. Q0 w
   reg [31:0] tmp_program_word;2 E3 t2 F& ^9 T3 s
   reg [31:0] program_array [0:NUM_PROGRAM_WORDS-1]; // 1M words = 4MB//8M words = 32MB
3 }2 {/ Y  A- ?, \5 G. x   reg [8*16-1:0] ddr2_ram_mem_line; //8*16-bits= 8 shorts (half-words)3 _1 u7 S2 u8 ?/ J, w- }( L
   genvar           i, j;# ]" s' v- J/ A$ p% u% Z& c
   generate
" U, @' l$ X4 C! }& P8 ?5 _% T      // if the data width is multiple of 16
  G  Q' n1 l) k  M" C      for(j = 0; j < CS_NUM; j = j+1) begin : gen_cs // Loop of 1" |2 p8 A( M) y6 L" D4 C
         for(i = 0; i < DQS_WIDTH/2; i = i+1) begin : gen // Loop of 4 (DQS_WIDTH=8)6 W" ?# Q( N* D' m1 q
            initial9 N+ @) [5 I  F- G$ ]3 R- o: [
              begin
7 b  V  _0 q2 }2 E- |2 N `ifdef PRELOAD_RAM
" g" H$ `* }4 i/ [8 I- R  `include "ddr2_model_preload.v"
9 k2 N% V# v' B, V( H. f& j `endif
5 [; S  t! B& w              end
- u( c+ k: n) d            
  j2 Y4 a" Y% m            ddr2_model u_mem0# p% \0 ^% i" s& H9 @7 a/ ]
              (7 K, q' W5 R  L; j1 R, g% \% N
               .ck        (ddr2_ck_sdram[CLK_WIDTH*i/DQS_WIDTH]),
1 b9 U8 @2 Y! l7 N               .ck_n      (ddr2_ck_n_sdram[CLK_WIDTH*i/DQS_WIDTH]),
/ j4 p' u  _* Y" M5 X               .cke       (ddr2_cke_sdram[j]),2 u+ f, k& ~) X& {( X8 ^% h
               .cs_n      (ddr2_cs_n_sdram[CS_WIDTH*i/DQS_WIDTH]),
8 q& q: b/ T& c; \& r* \               .ras_n     (ddr2_ras_n_sdram),
0 o) q- s2 b! P( m5 {$ J7 X, o               .cas_n     (ddr2_cas_n_sdram),4 g3 {7 H! h" D1 s
               .we_n      (ddr2_we_n_sdram),- m% z, U3 {, N2 p* m3 |' w, X
               .dm_rdqs   (ddr2_dm_sdram[(2*(i+1))-1 : i*2]),7 P4 E: [/ d0 M8 r8 b- K5 C/ b
               .ba        (ddr2_ba_sdram),# j. p6 D/ N' m+ ^1 ~: A! Y- V
               .addr      (ddr2_a_sdram),
+ z1 ]0 j  i( z# f& t; G* ~               .dq        (ddr2_dq_sdram[(16*(i+1))-1 : i*16]),: C5 T# I# v0 ~1 O: O" q* j$ m
               .dqs       (ddr2_dqs_sdram[(2*(i+1))-1 : i*2]),
, i0 R% G( s$ h" p& _               .dqs_n     (ddr2_dqs_n_sdram[(2*(i+1))-1 : i*2]),
9 w3 n! {7 j5 w5 S+ [               .rdqs_n    (),: o. H0 D) q. t- K+ \. r0 X. O
               .odt       (ddr2_odt_sdram[ODT_WIDTH*i/DQS_WIDTH])& x$ H, y, ?7 @5 ]
               );
6 I) N+ Z0 l# Z3 C, ?" s         end" P) m. Y! W- `. D7 w
      end8 e- P& W3 F# M' L. v" j& e- l
   endgenerate; v- J: C9 M/ G: k- w
   1 p/ d5 r9 w: ~' f
`endif
4 t6 _! z2 m  O7 ~+ k& D; x" Y+ v0 s* g2 o, p$ L

. s% u! l8 g8 I% a1 Q6 M- E下面是ddr2_model_preload.v的修改后的代码:* ~5 o; b) N) Q( |& y

4 @6 T1 L1 X" w// File intended to be included in the generate statement for each DDR2 part.$ I. l1 z5 o, x* t: ]
// The following loads a vmem file, "sram.vmem" by default, into the SDRAM.4 t* n* r7 a; T( B; a4 r& l" w
- e) c/ z& W* C# p9 s
// Wait until the DDR memory is initialised, and then magically. p0 ?1 I6 ?8 p8 P
// load it; x2 g( e  N) Q" _
$display("%t: wait phy_init_done",$time);9 q. x( N3 L8 n+ }- R; K
@(posedge dut.xilinx_ddr2_0.xilinx_ddr2_if0.phy_init_done);
( l7 e. ]1 X. \3 y" p$display("%t: Loading DDR2",$time);
% p; K6 T( [+ G$ T1 H2 { 8 `" @* B! {' L2 o# f, e
$readmemh("sram.vmem", program_array);
& s- ]( a9 u( z2 p0 y/* Now dish it out to the DDR2 model's memory */
3 [; _$ [, B  y3 u% Tfor(ram_ptr = 0 ; ram_ptr < 64*1024/*4096*/ ; ram_ptr = ram_ptr + 1)9 A% l, V! w% z4 F- w  X( t
  begin; t# o. z( Z; @6 _, ?, K9 H
     // Construct the burst line, with every second word from where we9 g  T/ K0 [2 f8 q
     // started, and picking the correct half of the word with i%2' m" v, E' B# W/ L6 T
     program_word_ptr = ram_ptr * 16 + (i/2) ; // Start on word0 or word1
2 C; {8 @1 B; s) b# T; j     tmp_program_word = program_array[program_word_ptr];
7 W' }" o& o" c% o# p6 h/ x# x     ddr2_ram_mem_line[15:0] = tmp_program_word[15 + ((i%2)*16) : ((i%2)*16)];
0 x' H0 q) c; C& \3 J# y/ u8 X     program_word_ptr = program_word_ptr + 2;% B( P) \" ~1 C8 w! K
     tmp_program_word = program_array[program_word_ptr];
% {9 y0 d9 Z; C3 V: [" \" G& e     ddr2_ram_mem_line[31:16] = tmp_program_word[15 + ((i%2)*16) : ((i%2)*16)];
5 G- H9 P: C+ Y( a; D     + d7 ?0 F/ V8 M- Q4 A% E# {0 `
     program_word_ptr = program_word_ptr + 2;* a4 m9 d$ P/ D
     tmp_program_word = program_array[program_word_ptr];! q1 d) G# Z8 H% v% o
     ddr2_ram_mem_line[47:32] = tmp_program_word[15 + ((i%2)*16) : ((i%2)*16)];
+ o& t2 H- ~3 o- ~- R- [: r. X     
/ ?* g" P: ?1 X7 Q2 |     program_word_ptr = program_word_ptr + 2;
: m7 f; ]8 C) T, q; c     tmp_program_word = program_array[program_word_ptr];
$ v5 U! M$ B5 {+ M. l     ddr2_ram_mem_line[63:48] = tmp_program_word[15 + ((i%2)*16) : ((i%2)*16)];8 q1 Y# H) N! _- _# l2 m8 @/ b
     
* D! _' H& U+ Y. Q/ B& A. t     program_word_ptr = program_word_ptr + 2;
) `  L- ]/ a& a$ m     tmp_program_word = program_array[program_word_ptr];
8 \* r4 J* B- f( P- u% n     ddr2_ram_mem_line[79:64] = tmp_program_word[15 + ((i%2)*16) : ((i%2)*16)];
5 \6 o% k8 \' e4 B! s: D- X     / w# t/ `* j' {. F) a/ D
     program_word_ptr = program_word_ptr + 2;- v) X7 j- Z- W
     tmp_program_word = program_array[program_word_ptr];) T+ z, a% N8 N' e# ?- A- s
     ddr2_ram_mem_line[95:80] = tmp_program_word[15 + ((i%2)*16) : ((i%2)*16)];4 w: i, a; Y4 w2 z
     ( @2 P2 f0 U9 t8 B5 i+ D4 d
     program_word_ptr = program_word_ptr + 2;
2 `+ @5 ^/ l4 S, |" Z3 G. H     tmp_program_word = program_array[program_word_ptr];
$ s2 f9 H* E' m  C. s5 c     ddr2_ram_mem_line[111:96] = tmp_program_word[15 + ((i%2)*16) : ((i%2)*16)];
* B0 d3 r/ Q3 y6 v1 q8 {$ q     
* D2 d4 Y* F8 p1 o6 `     program_word_ptr = program_word_ptr + 2;
/ P8 k$ {- v) d# ~. i; G0 L5 r     tmp_program_word = program_array[program_word_ptr];! [% V- J& u! S, D; J
     ddr2_ram_mem_line[127:112] = tmp_program_word[15 + ((i%2)*16) : ((i%2)*16)];
; }% I; n9 H4 Q* O     " S6 W0 ?; y  X' \! B; \: ]' T" ]
     // Put this assembled line into the RAM using its memory writing TASK
6 W! ]0 _- q, @     //                 (bank ,row          , { col               }, data
/ H# \" O" h% X7 u     u_mem0.memory_write(2'b00,ram_ptr[19:7], {ram_ptr[6:0],3'b000},ddr2_ram_mem_line);5 Q9 P$ ~6 H2 R7 n: |7 w% c
     5 _* M8 L  D. k- t* u" j% r1 W/ ?" i
     //$display("Writing 0x%h, ramline=%d",ddr2_ram_mem_line, ram_ptr);
8 g+ ?. r! ]+ R7 s5 D: r. X     . t, O% G* P# o+ W+ f% E3 _
  end // for (ram_ptr = 0 ; ram_ptr < ...
( Y  T2 j4 {) t' k$display("(%t) * DDR2 RAM %1d preloaded",$time, i);
, x! R7 p+ h6 |* q; e
8 E7 p( V& b- |7 p这里有两点需要注意:
9 E* L7 }9 a/ d, F& [6 k首先,program_array[]是连续线性的,但是4个device的组织不是连续线性的,所以在调用memory_write()之前一定要变成DDR2 SDRAM实际的组织形式。
. {2 f0 B% n2 o# G
2 X$ f1 p3 H) x9 F此外,由于我们只preload了32MB,小于一个bank,所以bank的地址我们一直是2‘b00,如果以后需要仿真的程序规模超过一个bank的大小了,那么就需要修改bank地址了。
. l) [0 j  j. z/ P4 |! Z8 K  D) v/ F% Y6 V: h4 X( u
$ z% A  z; h' Y) ]
2,验证
' k) |4 g" X6 F& U' E" d) a: j修改orpsocv2/sw/makefile.inc中,使之使用现成的elf文件,生成vmem文件。具体修改方法和操作步骤,之前已经介绍过了,这里不再赘述。
. m9 `% ~* ~5 z- |0 S  [2 E  m4 D  n: N  O3 |( {1 I
执行:make rtl-test TEST=linux PRELOAD_RAM=1
  H! J. T( z9 F1 \4 M7 p
" W' S7 c  R5 \8 V即可得到linux的仿真结果,和实际下板的结果相同。; k' y; M  I' U: {& ^

) O; p7 n3 E' Z; d) ]7 j毫无疑问,由于linux程序规模很大,如果要等到linux启动完成,需要等待很久。( Q# z' L* w4 l. v# g$ i

4 f$ a. f- {6 u2 M3 i下面是部分输出:
3 L8 w% D1 N9 c7 q# a9 s/ F
0 x* s1 f# q3 t& |
3 n& Y- G( a: P( q: G. }6 O6 J! W! i9 F+ M% j  t2 L

, @, X3 v3 A$ l# }% _% _: [下面是仿真一晚上的结果:. g3 ~9 ^) }4 S% u: _3 |& l. h

+ M8 m8 A% W3 p5 I; x1 H5 O+ Z# vsim -do {set StdArithNoWarnings 1; run -all; exit} -c -quiet -suppress 8598 tb
0 P6 G! ~4 z# D$ L* t  M# //  ModelSim SE 10.1c Jul 27 2012 Linux 3.5.0-43-generic
. @1 i5 ~% ]$ d# //4 i% S- x; w! h
# //  Copyright 1991-2012 mentor Graphics Corporation
$ g. Q9 D- |3 M$ q. `0 l# //  All Rights Reserved.0 a' i& {& r0 ~7 x! e
# //( t6 w5 ^4 Y8 J
# //  THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION3 E0 B5 g2 @( d& @: g1 }
# //  WHICH IS THE PROPERTY OF MENTOR GRAPHICS CORPORATION OR ITS
+ }+ u* ?  k8 H( w' u+ h# //  LICENSORS AND IS SUBJECT TO LICENSE TERMS.  W3 \' s* H$ b# g
# //
0 o3 Q4 d0 w7 }. t+ G9 r1 c# set StdArithNoWarnings 1 8 n) X; F% d8 p& Y- ?' y
# 1' q( N4 O: ], y2 I; X$ J
#  run -all * i8 v2 S& O" ~
# Block Memory Generator CORE Generator module orpsoc_testbench.dut.xilinx_ddr2_0.xilinx_ddr2_if0.cache_mem0.inst is using a behavioral model for simulation which will not precisely model memory collision behavior.
- ]5 G6 `- E6 q5 o. j# Xilinx DDR2 MIGed controller at orpsoc_testbench.dut.xilinx_ddr2_0.xilinx_ddr2_if0.ddr2_mig07 a0 [' j8 |8 }2 A' S1 Z5 {, G
#
: x) Y) `7 R+ o* w  P( L# 4 O& ~; N; a" S6 G- c
# * Starting simulation of design RTL.4 j# S, T: ]+ [$ q
# * Test: linux
9 F' P1 K. C9 q9 T5 ]9 P' j9 f# 0 s  \8 g; h' h! w) e" U( [
#      0.00 ns: wait phy_init_done
, c- ^+ R  N: F: D- _; d, T9 A+ F# 0.0 ps: wait phy_init_done6 i& q3 x+ o: N
# 0.0 ps: wait phy_init_done
8 j6 m! B& p$ l* v% x0 h! N# 0.0 ps: wait phy_init_done
2 e$ Y0 t/ ^- W+ L. e- `$ g# (1000.0 ps)(orpsoc_testbench.eth_phy0)PHY configured to 100 Mbps!2 }# k' `( I3 q4 n* M* v$ e' J
# (1000.0 ps)(orpsoc_testbench.eth_phy0)Ethernet link is up!
8 l" D% c+ [" {/ x( W/ j# Input Error : RST on instance orpsoc_testbench.dut.xilinx_ddr2_0.xilinx_ddr2_if0.ddr2_mig0.u_ddr2_infrastructure.gen_pll_adv.u_pll_adv at time 112500.0 ps must be asserted at least for 10 ns.4 u) _: S/ ~8 \9 R# k
# DEBUG i2c_slave; stop condition detected at 174000.0 ps
/ @' b# m3 c/ a5 O" ~# orpsoc_testbench.gen_cs[0].gen[0].u_mem0.cmd_task: at time 8525725.0 ps WARNING: 200 us is required before CKE goes active.
9 i$ U, L$ K- t  B+ s# orpsoc_testbench.gen_cs[0].gen[1].u_mem0.cmd_task: at time 8525725.0 ps WARNING: 200 us is required before CKE goes active.6 m: k$ G1 C/ M% i, k
# orpsoc_testbench.gen_cs[0].gen[2].u_mem0.cmd_task: at time 8525725.0 ps WARNING: 200 us is required before CKE goes active.: H. ^3 w2 i" o* D( q% k9 E1 G
# orpsoc_testbench.gen_cs[0].gen[3].u_mem0.cmd_task: at time 8525725.0 ps WARNING: 200 us is required before CKE goes active.5 Y, c3 c7 Z4 L5 N- e
# First Stage Calibration completed at time 25988000.0 ps
; |6 Q- B  e' E. j  \% a# Second Stage Calibration completed at time 32918000.0 ps
  i7 }5 x% p7 K. x5 V9 C# Third Stage Calibration completed at time 40320000.0 ps
) \" s* K% j& ^: N& m6 ]7 G# Fourth Stage Calibration completed at time 51338000.0 ps0 j# [& y* k  r* s! H! b0 Q
# Calibration completed at time 51338000.0 ps
  N! |9 |; y! ?) x" e1 ~: G: z# 53430000.0 ps: Loading DDR2
6 B1 ~2 F* L* R/ [4 q2 [3 d# (53430000.0 ps) * DDR2 RAM 3 preloaded
4 ]/ s* G) Q" Z/ z# r# 53430000.0 ps: Loading DDR2& V4 B2 _. D" i0 Y! j# W
# (53430000.0 ps) * DDR2 RAM 2 preloaded8 X( v  r5 w' D3 Q/ @2 l- \
# 53430000.0 ps: Loading DDR2
  F0 `, A0 f3 x; o  v# (53430000.0 ps) * DDR2 RAM 1 preloaded% ?7 ^4 Z% B' }! Q: `
# 53430000.0 ps: Loading DDR2
6 U# i% _5 C  c6 @# t# (53430000.0 ps) * DDR2 RAM 0 preloaded
4 B- N' k/ `6 Q# Or1200 IC enabled at 7808632500.0 ps
$ R& s  A! D5 O* z# Or1200 DC enabled at 7919317500.0 ps1 l0 e) X* `' R0 D% u, L
# Compiled-in FDT at 0xc026b8a0
% T4 K+ T0 c7 e# : P; G+ O1 ]* o0 h5 K' h
# Linux version 3.1.0-rc6-00002-g0da8eb1-dirty (openrisc@openrisc-VirtualBox) (gcc version 4.5.1-or32-1.0rc4 (OpenRISC 32-bit toolchain for or32-linux (built 20111017)) ) #107 Mon Mar 3 08:13:04 CET 2014
1 R" c& G; N" g, p% o: h! n# 8 d/ Z& |3 a; R8 @) F8 ^
# CPU: OpenRISC-12 (revision 8) @66 MHz+ E3 D# `- i! |* j
# / R! y" I5 H: V* |) W* ]/ g
# -- dcache: 32768 bytes total, 32 bytes/line, 1 way(s)( a& b: s, a" [0 s- r
# , P8 m! X( N# X7 h; t. x, _; D2 H
# -- icache: 32768 bytes total, 32 bytes/line, 1 way(s)- j4 E5 T( l/ ^! l
#
  U/ p1 E$ ^) {# Q* c. M# -- dmmu:   64 entries, 1 way(s)( Y5 u- W3 M- H
#
7 d0 T7 F; K& h# -- immu:   64 entries, 1 way(s)- ~! v5 J- t. d1 h: u- c) G" t# Y6 x7 U
#
$ X% G+ n# Z: I5 N# -- additional features:6 K$ Z! ]# i4 t% ^4 f0 r
# . `6 k# V+ j3 r0 g7 u8 X
# -- debug unit& N5 M$ K2 ?6 T+ {
#
( z: j) u7 l# V& U# -- PIC- }: }2 k) y8 t. E; f
#
+ R6 w( a* r. ^! r# -- timer
9 v; ^" a1 N3 E( z& N# ! P0 m, z4 T) b5 x! e3 }; N
# setup_memory: Memory: 0x0-0x2000000
' J2 H* }! m! n: I2 i: M# & W9 X. S: I  G7 Y8 _, {) _; s
# Reserved - 0x01ffd9dc-0x000026242 e' v$ K9 @! s
#
( K# t; y- [! l2 B# Setting up paging and PTEs.: }) A8 t* O4 k  T
#
; p" M/ F- M/ \! L! M1 Z$ A# map_ram: Memory: 0x0-0x2000000
! Y5 m9 u6 D- f. G0 i#
0 m" c0 `0 t  c# On node 0 totalpages: 4096" E2 X- q7 J+ h
#
- V3 k% O0 R7 I* X: L) m) C# free_area_init_node: node 0, pgdat c02525b8, node_mem_map c03cc000
1 s; Z6 w" U% o% m/ F  X8 T#
. R5 m- U2 F9 Q/ L' l) e4 S# `#   Normal zone: 16 pages used for memmap
; Y* i0 f5 g; g9 }6 L5 Q0 O#
+ `) j6 p; `9 V. S#   Normal zone: 0 pages reserved+ Y& T( l/ B3 l2 m
# 4 A( p2 Z' P0 F0 H, p
#   Normal zone: 4080 pages, LIFO batch:0
* g+ Y/ ]  V( E% e- a#
! q$ ^" e3 F1 q# dtlb_miss_handler c00020006 v+ R2 w- N! ?
#
+ ^; n0 j5 t+ z* E5 t- p4 c% r# itlb_miss_handler c0002108, ]" t  `9 w" {& [5 O4 P
# 0 j9 |* A; ]; |2 l$ g
# OpenRISC Linux -- http://openrisc.net
7 e" H! e8 \. d3 ?# 0 h' |& ^& V7 x/ K$ e& P
# pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768# e1 |/ }' B, o9 A
# ! p5 j; X0 x8 x  W$ ~* }' c
# pcpu-alloc: [0] 0 ! K) S# i' x! k0 t8 ^  w& w3 s7 K
#
( Z; h; `. I7 A/ S# Built 1 zonelists in Zone order, mobility grouping off.  Total pages: 4080- R7 U% x/ b3 w
#
& }  ]; x- H7 e6 a6 w# Kernel command line: console=uart,mmio,0x90000000,115200. w- T7 i1 _& L! @8 U
#
% b! n+ D  s: R+ Z% Q8 j9 j# Early serial console at MMIO 0x90000000 (options '115200')) P7 n9 w; T  I& k0 j
#
/ |7 D1 o0 M* i  u$ g9 X' k& e# bootconsole [uart0] enabled
6 |# p9 _' m# X" T. C5 C#
1 g# I9 c0 d: o6 y' U! y5 P# P# PID hash table entries: 128 (order: -4, 512 bytes)
( F8 @( _5 w' d' B$ G4 V: M; W# % c+ @9 P( H9 ]( S& ~
# Dentry cache hash table entries: 4096 (order: 1, 16384 bytes)
" R0 ]( n! m, s! I#
4 A6 W) ]8 H9 G' e) ]# Inode-cache hash table entries: 2048 (order: 0, 8192 bytes)
+ L( Z2 j& u6 k9 N$ ~) g& X0 K#
" ]" ?+ B- n! f# Memory: 28648k/32768k available (2064k kernel code, 4120k reserved, 316k data, 1416k init, 0k highmem)
# f% z5 \2 S& Y2 r#
" l3 R; p, ]8 [# mem_init_done ...........................................& Z7 |! `" S, K
#
5 e+ l  E$ s2 ~! _+ f# NR_IRQS:32  v/ Q6 X: U/ s& w5 X1 ~" x+ J
# . I5 s! b( E& H" r6 z% e
# 133.33 BogoMIPS (lpj=666666)' K$ r% U1 O7 r7 x  H6 c
# 7 S; _& Z: M& _- O
# pid_max: default: 32768 minimum: 301
: ~) ?" K! a  l) z0 {9 W% n#
% X* R2 ^. A/ f( t9 _4 t$ i) e# Mount-cache hash table entries: 1024
" ?) z6 p) W6 |5 @" [9 r3 U4 V#
) y& Q0 ^2 d) _+ s% J1 t, h# devtmpfs: initialized$ \1 s+ r% ~7 m
# * w' S2 N4 W" i) I- `# R8 _
# NET: Registered protocol family 166 y2 r4 v" p5 T( b/ @: l
# 0 y* u/ o! x- l3 C& B
# Switching to clocksource openrisc_timer0 `* j7 l* F9 _$ q5 B- E; b
#
, {8 _. {! j0 q3 q4 \! f# Switched to NOHz mode on CPU #0( @. k. {; b, i* r0 }" |
# 8 L* R0 A0 ~6 w0 R4 F- r
# NET: Registered protocol family 2) K; o: T2 Q3 G6 a' d3 z( D: _+ E; t" x
# ! ?$ b  V, m0 t4 Q
# IP route cache hash table entries: 2048 (order: 0, 8192 bytes)
/ t1 _( D% m+ {1 y  o" a( w. @# i#
! T- l# X; R( y8 t& _# TCP established hash table entries: 1024 (order: 0, 8192 bytes)
& [, t0 ^6 w% x5 F#
5 x1 q- z1 v4 G  x4 U# T5 c# TCP bind hash table entries: 1024 (order: -1, 4096 bytes)! M1 ~1 g( H* k( k
# / Z# V" h& d4 h. Y% F1 \
# TCP: Hash tables configured (established 1024 bind 1024)
& @! u0 o- `+ t#
: e" U$ M! ]& W3 |# B# TCP reno registered
  J& H7 D7 F8 ~9 g" S" J#
% X6 N- m8 J6 q6 V  |$ o* [# UDP hash table entries: 512 (order: 0, 8192 bytes)
8 h% v: X4 }: M( v# " c! M: {" U7 e9 I. I+ ?
# UDP-Lite hash table entries: 512 (order: 0, 8192 bytes)
& g8 p3 a+ K4 u  f' y#
0 {: Z' l& U8 T. z) c, m# NET: Registered protocol family 1' u" \8 j$ f3 u: b1 |
#
& y6 E8 W8 S. d! w; ]# RPC: Registered named UNIX socket transport module.
  V! F: m, U9 B3 J% \/ e#
, q! |9 A! f" @" q6 a3 G' Y0 u# RPC: Registered udp transport module.: H$ R7 y0 F( Y- q/ M
#
  H7 a+ z) R: ~4 z7 L1 K3 I# RPC: Registered tcp transport module.
. ~2 Q7 U' w. |# ) K; H* k3 g; W
# RPC: Registered tcp NFSv4.1 backchannel transport module.$ M. A5 ?  I" X: i. l
#
& }2 ^/ n' `7 V- Z( Q' c4 M% F# Unpacking initramfs
  w: ^: a- c8 [3 ^#
3 K3 N# ^6 [( r  p# Break key hit
9 O+ Y( |0 U0 p; I# Break at an unknown location1 f; y2 D' x/ s, Q1 E. d3 n+ |
#  exit
3 i8 B( i8 D& K' K4 E. N! A& m" ^- ~0 T9 K* x
4 J  T* B. T( u
3,小结0 o5 m7 y7 C2 I( U
之前搞嵌入式,linux的启动信息很熟悉,但是如果想知道linux启动过程中,硬件的具体工作时序,几乎是不可能的,现在板子上所有设备的每个clock的状态,通过RTL仿真,即可实现。! u- b* K% b* ]7 B5 G+ d
% i5 }( ]1 P5 b- T6 V6 ^' d

该用户从未签到

2#
发表于 2020-11-11 15:20 | 只看该作者
基于ORPSoC对linux进行RTL仿真
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 20:03 , Processed in 0.218750 second(s), 27 queries , Gzip On.

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

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

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