-
-
Notifications
You must be signed in to change notification settings - Fork 27
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[提案] signed 型の部分取り出し時の扱い #94
Comments
どちらかというと、unpacked arrayに対応させる方が良いのではないでしょうか? |
#93 と併せてpacked/unpackedの区別ができればいいということになるかと思います。
|
packed/unpacked の区別ができる構文は非常に汎用性が高いように思いました。 あと、あえて言うなら、古い Verilog 表記のモジュールや、ハードマクロに packed 化してそのまま入れたい時があるので、packed へキャストする方法もあるとありがたいです。 あと、少し違う話なのですが Verilator が
を、signed と解釈してしまうようで、合成器との不一致で悩んでいたりします。 他にもローカル変数定義で Vivado Sim が デフォルトで automatic で、 Vivado Synthesizer が static 解釈なので不一致が起こったりと、各ツールのバグや方言や実装依存で振り回されることもあります(Verilog上は static が正しいのだと思いますが、モダン言語的には automatic であってほしいところでして)。 |
|
module test;
bit signed [1:0][1:0] a;
bit signed [1:0] b[2];
initial begin
a[0] = '1;
b[0] = '1;
$display("%d %d", a[0], b[0]);
#1;
$finish;
end
endmodule の大手三社のシミュレータでの実行結果は、
になりますし、LRM には、
とあるので、a の宣言が |
|
Verilator で試すと
になってしまいますね。
私も多分そうだとは思っております。 |
という宣言も可能になってしまうので、「符号付の場合、幅は2ビット以上」というチェックを入れても良さそうですね。 |
すみません logic signed [7:0][3:0] a; の間違いです。 |
DeepLearning などで INT1 はありえるので、文法上何らかの誤解のない符号付き 1bit の宣言方法もあると良いように思いました。
の [0:0] に来る部分を省略できないようにするとか如何でしょう。 |
私もそれがいいと思ったのですが、よく考えると signed 1bitについては -1~0の範囲を正しく表現できるので、不正扱いする必要はないように思います。
logic signed a [8];
logic signed [0:0] a [8];
logic signed [4-1:0] a [8];
logic signed [4-1:0][4-1:0] a [8]; となるので、1bitであることを明示したい場合は |
packed であれば、任意の型でpacked arrayにできますし、logic/bitに限定する必要はないのではないでしょうか? |
元々の考えとしてはSVで任意の型とpackedとunpackedを組み合わせ可能なのは自由度が高すぎて、混乱を招いている気がしたので制限する方向でした。 |
無いと絶対に困ると言うほどではないですが、
ですね。 1.に関しては、SV 出力時の配列のフォーマットを選択できるようにすれば、事足りるのかもしれません。 RgGen では Verilog との相互運用性を要望された際に、配列のフォーマットを、
から選べるようにして、対応しました。 |
なかなか難しいですね。 |
よく考えると #93 のような挙動はどのみち制御不能なので |
ご検討頂きありがとうございました。 |
やはり
|
そもそも packed を |
既存言語における https://zenn.dev/qnighy/scraps/34d96c787a758d このうち今回適用できそうなのはRustのやり方(式中に出現する
既存言語には存在しないが、比較演算子側を妥協すると
長さがそろうのはいい気もしますが、さすがに違和感が…。 式中に突然型が出現することはtype parameterくらいしかない(キャストは |
Rust方式は解決になってないですね…。
比較演算子 |
<=と文字数が揃うので、<:は良いのではないでしょうか? |
既存言語にないので違和感ある気がしていましたが、案外良いかもしれませんね。 |
字句解析に知見が無く素人意見で大変恐縮なのですが、演算子には C や Rust を継承してほしい気はします(初見ユーザーが混乱しそうに思いました)。 例えばですが module や function の parameter 指定みたいに
みたいな記法とか、 みたいに添え字の方に packed, unpacked を区別する何らかのプリフィックスを付けるとかは難しいのでしょうか? あと、本家 Verilog がやってるように begin, end を使うことで {} を空けるとかはありえるのでしょうか? 素人質問ばかりですみません。 <: も悪くはないのだと思いますが、ちょっと面食らってしまった印象があったので。 |
logicのpacked幅は最もよく使う記法なので
|
なるほど。私個人としても Verilog の延長色が強いので特に合成可能記述では unpacked は殆ど使わないのですよね。 確かにですね。 logic [4, 8; 4] とか、何かセパレータを置く方がまだ自然かもしれませんね。
Rust 風に統一できるのであれば、個人的には一番嬉しいです。 |
変数宣言のところも、 |
大量に出てくる構文なので
|
(この issue の趣旨ではないかもですが、Veryl の フォーマッタ試してみて、縦に綺麗に揃うのはとても素晴らしいなと思いました。) 以下、素人意見なのですが、 ユーザーにもよるのかと思いますが、特に合成用の記述に関しては packed が主役(packedは配列というよりバス幅の多次元なイメージ持っています)で、めったに unpack は出てこないので、正直 packed に一等地の記号を割り当ててほしい気はします。 一方で、
というのが言われてみると、その通りで、int の配列のようなものが Rust と同じに書けないのも嫌な感じがします。
に近いものを混乱ない文法で書ければしっくりくる気はします。 個人的に Veryl に期待している部分として
というのがあります。SV を書く人にもとっつきやすいに越したことはないのですが、Veryl の現在の文法を見ていると、SV の思想よりは Rust の思想を優先した方が良い方向に行きそうに感じました。 |
どの括弧を使うかで再度まとめてみました。
|
個人的な好みですが、
になると良いですね。
|
ありがとうございます。結構、好みが出てくる感じの判断ポイントなのでしょうか。
これもよさそうには思っていますが、一つ質問があり、曖昧性の発生しない文脈では <: を < と書くのは許されたりするのでしょうか? それとも一般的な言語設計として、そういうことはするべきではなく、すべて <: と書くようにすべきものなのでしょうか? 何れの場合でも、文字を揃えたいケースはよくわかるので < を <: とも書ける仕様は嬉しそうな気はします。 |
一般的に文脈によって切り替わるようなことは主に後方互換性維持のために行われています。ただそのようなことをするとパーサ実装が複雑化するので、新規設計の言語で積極的に採用するべきではないと思います。
私も多言語を行ったり来たりするので懸念は分かります。 ここまでの議論と私自身の好みを加味して以下の2案が妥当かな、と思います。
|
if 文の構文とっても、各言語でいろいろ違いがありますが (else if/elsif/elseif など)、言語の切り替わりの際に手が滑る程度で、大きな問題なく切り替えできますし、比較演算子が |
個人的な好みは |
なるほど、よくわかりました。勉強になりました、ありがとうございます。
私も同じ意見です。 好みの問題になるのであれば、言語作者の方の好みを優先頂くのが作者特権ではないかと思います。 |
たくさんのご意見ありがとうございます。
の2点を重視したいと思います。特に後者は今やっておかないと、将来 |
我儘な issue にご対応いただきありがとうございました。大変勉強になりました。 |
対応して v0.3.0 をリリースしました。 |
SystemVerilog では
logic signed a[7:0][3:0];← (間違っておりました)のような signed な 32bit の変数を a[1] のように4bit だけ切り出すようにすると unsigned になってしまうようです。
例えば下記などにもその話があります。
https://stackoverflow.com/questions/57216757/is-signed-type-valid-for-each-element-using-typedef-packed-array-v-s-multidi
Verly では Rust 的な構文となっているので、例えば自動で $signed(a[1]) のように $signed で囲まれるようにするなど如何でしょうか?
The text was updated successfully, but these errors were encountered: