Home FAQ Categories RTLガイドライン

Memory 既存Memoryを利用するWrapperの作成方法

要求するMemory構成がない場合、既存のMemoryにWrapperを作成して設計を継続する場合の注意点

1)出力ポートが足りない場合 ==>足りないビットをwire定義して、Instance文に追加する。
wire  [311:256] Q_x;
wire  [311:256] QP_x;
.Q({Q_x, Q}), .QP({QP_x, QP}), 

2)入力ポートが足りない場合 ==>Instance文に上位ビットを追加する。
.WEM({56'b0, WEM}),

3)Wrapping先にないポートはInstance文に定義しない。
// sadulsph4s2p2048x256m4b2w0c1p0d0t1s10 u_mem (  .SO_D_LA(SO_D_LA), .SO_D_HA(SO_D_HA), .SO_CNTRA(SO_CNTRA), .QB({QB_x, QB}), .QPB({QPB_x, QPB}), .SO_Q_LB(SO_Q_LB), .SO_Q_HB(SO_Q_HB), .SO_CNTRB(SO_CNTRB), .ADRA({3'b0, ADRA}), .DA({96'b0,DA}), .WEMA({96'b0, WEMA}), .WEA(WEA), .MEA(MEA), .CLK(CLK), .TADRA(11'b0), .TDA(4'b0), .TWEMA(1'b0), .TWEA(1'b0), .TMEA(1'b0), .TCLK(1'b0), .BISTE(1'b0), .TCLKE(1'b0), .DFTCLKEN(1'b0), .RME(1'b0), .RM(4'b0010), .SI_D_LA(1'b0), .SI_D_HA(1'b0), .SI_CNTRA(1'b0), .SE_IN(1'b0), .LS(LS), .DFTMASK(1'b0), .ADRB({3'b0, ADRB}), .MEB(MEB), .PIPEMEB(PIPEMEB), .TADRB(11'b0), .TMEB(1'b0), .TPIPEMEB(1'b0), .CDB(4'b0), .CAPTB(1'b0), .STICKYB(1'b0), .TEST1(1'b0), .TESTRWM(1'b0), .SI_Q_LB(1'b0), .SI_Q_HB(1'b0), .SI_CNTRB(1'b0), .SE_QB(1'b0));
sadulsph4s2p2048x256m4b2w0c1p0d0t1s10 u_mem (  .SO_D_LA(SO_D_LA), .SO_D_HA(SO_D_HA), .SO_CNTRA(SO_CNTRA), .QB({QB_x, QB}), .QPB({QPB_x, QPB}), .SO_Q_LB(SO_Q_LB), .SO_Q_HB(SO_Q_HB), .SO_CNTRB(SO_CNTRB), .ADRA({3'b0, ADRA}), .DA({96'b0,DA}),                       .WEA(WEA), .MEA(MEA), .CLK(CLK), .TADRA(11'b0), .TDA(4'b0),               .TWEA(1'b0), .TMEA(1'b0), .TCLK(1'b0), .BISTE(1'b0), .TCLKE(1'b0), .DFTCLKEN(1'b0), .RME(1'b0), .RM(4'b0010), .SI_D_LA(1'b0), .SI_D_HA(1'b0), .SI_CNTRA(1'b0), .SE_IN(1'b0), .LS(LS), .DFTMASK(1'b0), .ADRB({3'b0, ADRB}), .MEB(MEB), .PIPEMEB(PIPEMEB), .TADRB(11'b0), .TMEB(1'b0), .TPIPEMEB(1'b0), .CDB(4'b0), .CAPTB(1'b0), .STICKYB(1'b0), .TEST1(1'b0), .TESTRWM(1'b0), .SI_Q_LB(1'b0), .SI_Q_HB(1'b0), .SI_CNTRB(1'b0), .SE_QB(1'b0));

4)module文のポート順は同一とする。
< module sad2lsph4s1p512x256m4b1w1c1p0d0t1s10_wrapper (Q ,QP ,ADR ,D ,WEM ,WE ,ME ,CLK ,PIPEME ,LS ); <==誤り
---
> module sad2lsph4s1p512x256m4b1w1c1p0d0t1s10_wrapper (Q ,QP ,ADR ,D ,WE ,WEM ,ME ,CLK ,PIPEME ,LS ); <==正しい順

Presto compilation completed successfully. (sad2lsph4s1p512x256m4b1w1c1p0d0t1s10_wrapper)
Error: Width mismatch on port 'WEM' of reference to 'sad2lsph4s1p512x256m4b1w1c1p0d0t1s10_wrapper' in 'lm_eff_single_port_ram_matrix_512_256_4_9_8'. (LINK-3)
この意味は、Portの「記述順序が異なっている」意味です。

RTLguideline iocheck AiIP0Xpinllist.csv 信号名 ビット幅 前後のスペース 未対応

以下のフォーマットは、iocheckは対応していません。
修正ねがいます。

1)AiIP0Xpinlist.csv   .Excell Cellの名称前後に不要なスペースは対応不可。
例
clock_ 	信号名clockの後に半角スペースもしくは全角スペースが入っている。
_[31:0]_ ビット幅の前後に半角スペースもしくは全角スペースが入っている。

2)信号種別は、以下の文字だけです。
IN	
OUT
INOUT

以下は対応していません。
in
out
inout

RTLguideline iocheck AiIP0X.v top module文前のコメント一部未対応

以下の構造に対応していません。
iocheckが実行できるように修正ねがいます。

//  comment
//  comment
<空行>
//  comment
<空行>
module AiIP0X(
clock input,

RTLguideline DDC 階層化保持は可能でしょうか

Q1) scr/01_synth.tcl

355 set power_cg_flatten true
356 ungroup -all -flattenFlat
こちら、確かにエリア削減含めQoRには効くと思うのですが、
module毎の確認であったり、パス解析の際に少々不便がございます。
また、初期のネットですと、回路が消えすぎてしまったりということも考えられると思います。

最終インプリでは全てフラットにする方針でしょうか。

A1) 
理由:DDCで階層化保持すると全てのToolChainで対応が出来ない問題あり。

Gate化後の解析容易性向上の観点から、特定の階層を保持したり、トップ階層から〇階層目までは論理階層を保持する、といった対応は可能です。
意図的な冗長回路がある場合は、その回路を残す設定を追加します。
なお、強力な回路圧縮をする設定になっておりますので、階層破壊を取りやめても、暫定的な入力固定や出力オープンがありますと回路が消えてしまいます。

Q2) Formality 自動ECOは対応してますでしょうか?

A2) 使用しません。A1)参照