2017-08-05 31 views
0

連結の最左端にunbased、unsizedリテラルを配置すると、欠落しているビットを指定された値で単純に埋め込むと仮定します。私は明示的にLRMでこれを述べているものは見ませんでした。SystemVerilog:連結のunbased unsizedリテラル

logic [63:0] rd_data; 
logic [31:0] mem_dout; 
logic [15:0] op_data; 
.... 
assign rd_data = {'0, op_data, mem_dout}; 

もちろん、次は違法次のようになります。

編集:@のdave_59が指摘したように、これはちょうど、直感的で法的ではありません。 、

assign rd_data = {op_data, mem_dout, '0}; 

は誰もが予想通り(1)これは、シミュレートしていることを知っているかどうかを確認したかった、と(2)主要な合成ツールは、正しいことを行うと、実際には0

+0

'assign rd_data = {'1、op_data、mem_dout};と試してください。 – toolic

答えて

2

に上位16ビットを結びます両方のステートメントは合法です。自己決定文脈では、'01'b0に相当します。連結のすべてのオペランドは、自己決定コンテキストで評価されます。両方の連結の結果は、32 + 16 + 1 = 49ビット式です。 rd_dataへの代入のコンテキストでは、これらの式は右揃えになり、15個のゼロで埋められます。

あなたが期待している結果が得られますが、全く異なる理由があります。

+0

最上部のビットの値に基づいてパディングが行われているか、またはVerilogは常に0パッドですか? –

+1

符号なしデータは常に0で埋められます。署名されたデータは、符号付きコンテキストの幅に符号拡張されます。 –