イーサネットスイッチネタを書いてて、また思い出したので書きます。
やはりコストダウン
プロダクト全体としてコストダウンを図るには、まず、
複数チップでシステムを構成していたものを、ワンチップ化する
という方向性があります。そういう要求で、以前のブログに書いていた、MACチップに相当する部分とルーティング情報を検索するチップとを統合し1チップ化するというプロジェクトがありました。
かつ、ポートは 10/100Mbps で、9ポートというものでした。なぜ9ポートかというと、ユーザー側に8ポートフルに使えて、かつバックボーン側のポート、というイメージですね。
MACレイヤーのチップには、受信したパケット情報を保管しておく、外付けのいわゆるパケットバッファメモリがあり、通常は、ポートごとに割り振られたメモリ内の区画が使われるのが普通でした。
ただしこの場合、何も接続されていないポートがあると、そのぶんメモリが完全に無駄になります。全体のメモリサイズを抑えつつ(つまりコストダウンしつつ)、それなりの受信パフォーマンスを実現するため、リンクリスト構造が採用されていました。
リンクリスト
このリンクリストとは、C++の実装構造などで言及されるアレと、思想的には全く同じです。
このプロジェクトの場合は、
- メモリ内を多数の細かい区画に分け、各々が次の区画へのアドレスをもっており、数珠つなぎになっている(どのくらいのサイズで分割してたかは忘れました)
- ポートごとの区画、という概念はない
- パケットを受信したポートは、アービターにメモリを要求して、いま先頭にある区画が割り当てられる、そこが使い終わったら、次の区画アドレスを読み取って、そっちにデータを入れていく
- そのパケットをしかるべきポートに送信し終わったら、空き区画として、リンクの最後尾につく
という感じの動きになります。ポートごとにメモリ区画を決めないので、柔軟にメモリを使えるメリットがありますが、アドレス管理が超面倒ですね。アドレスの管理を間違って、リンクリストの数珠つなぎが切れたらアウトです。
個人的には、結構危なっかしいなーと思いながら見ていました。コスト削減もわかるけど、リスクと効果の割が合わない気がしていました。まあ、実装したのは私じゃないんですけど。1チップ化は明らかに効果大きいですね。
頭良すぎるのも問題
話がズレますが、このプロジェクトでルーティング部分のロジック設計をしてたエンジニアは超キレる人だったんですが、
RTLコードをゲートレベルのように記述してしまう
というクセがあり、他者にはさっぱり分からないコードになっていることがほとんどでした。さすがに、ゲートレベルのプリミティブが置かれているということではないのですが、assign 分の右辺に巨大な論理構造を記述する、という感じでとても困った覚えがあります。彼のアタマのなかでは、抽象度の高いロジック表現ではなく、ゲートレベルで描かれているのでしょう。
きちんと動作する、ということが大事ですが、それ以前に、
他者がレビューできるように分かりやすく書く
というのは、動くことを担保するために重要なんですよね。
まとめ
ということで、これらの件で思ったことは、
- コストダウンと複雑さはトレードオフになることがあるけど、できれば安全パイのほうが良いのではないか?コストダウン目的のはずが、チップがまともに動かずリスピンするほうが、市場投入の遅れも含めて、高くつくのかも?
- 設計したコードはプロジェクトの資産だから、コメントや変数名も含め、他者にも分かりやすい形で表現しないと、自分以外の人には価値がなくなる。プロジェクトとして、だれが作ったコードでもそれが属人的なものになることは明確に非推奨とすべき。
ということでした。