最近は回路図やブロックダイアグラムを除いて、シーケンス図やステートマシンなどを図形エディタで書くのが面倒くさくなってしまっており、MarkdownエディタであるTyporaの図形描画機能を使っている。
ここのページに上手くまとめられている。
最近便利で重宝しているのはステートマシンを書く方法。テキストで、ノードからノード、条件を羅列すれば自動的にステートマシンのブロックを構成してくれる。とても便利。
こんな感じで書けばステートマシンを構成できる。
```mermaid graph TB STQ_INIT --> |dispatch load| STQ_ISSUE_WAIT STQ_ISSUE_WAIT --> |flush| STQ_DEAD STQ_ISSUE_WAIT --> |ready to pick| STQ_ISSUED STQ_ISSUED --> |flush| STQ_DEAD STQ_ISSUED --> |ex1_update & TLB hazard| STQ_TLB_HAZ STQ_ISSUED --> |ex1_update & TLB get PA & !rs2ready| STQ_WAIT_ST_DATA STQ_ISSUED --> |ex1_update & TLB get PA & rs2ready| STQ_DONE_EX2 STQ_ISSUED --> |ex1_update & source mispredicted| STQ_ISSUE_WAIT STQ_TLB_HAZ --> |flush| STQ_DEAD STQ_TLB_HAZ --> |!flush| STQ_DONE_EX3 STQ_DONE_EX3 --> |flush| STQ_DEAD STQ_DONE_EX3 --> |!flush| STQ_WAIT_COMMIT STQ_WAIT_COMMIT --> |flush| STQ_DEAD STQ_WAIT_COMMIT --> |commit & match| STQ_COMMIT STQ_COMMIT --> |sq_op_accept| STQ_COMMIT_L1D_CHECK STQ_COMMIT_L1D_CHECK --> |L1D read miss| STQ_WAIT_LRQ_REFILL STQ_COMMIT_L1D_CHECK --> |L1D read conflict| STQ_COMMIT STQ_COMMIT_L1D_CHECK --> |found evict merge| STQ_INIT STQ_COMMIT_L1D_CHECK --> |L1D read hit| STQ_L1D_UPDATE STQ_L1D_UPDATE --> |L1D write conflict| STQ_COMMIT STQ_L1D_UPDATE --> |!L1D write conflict| STQ_INIT STQ_DEAD --> |STQ commit update| STQ_INIT ```
もう一つはシーケンス図。こんな感じでブロック間の関係図を書くのが便利。これもテキストで書いている。
```sequence participant LDQ_entry[*] as ldq participant LSU Pipeline as lspipe participant L1D as l1d participant STQ as stq participant Store Requester as streq ldq -> lspipe: LSU Issue lspipe -> l1d: Hit / Read check l1d --> lspipe: Hit / read resp lspipe -> stq: Forwarding check stq --> lspipe: Forwarding resp lspipe -> streq: Forwarding check streq --> lspipe: Forwarding resp Note over lspipe: Read Data write into register ```