工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Verilog

Verilog連結マスター:実践ガイド

複数ビットのVerilogワイヤや変数を、連結演算子 { と } でカンマ区切りで結合し、より大きなマルチネットワイヤや変数を形成できます。連結にはワイヤや変数に加え、式とサイズ指定付き定数もオペランドとして使用可能です。

連結の全サイズを計算するため、各オペランドのサイズは既知でなければなりません。

Verilog連結の例

wire a, b;           // 1ビットワイヤ
wire [1:0] res;      // aとbを格納する2ビットワイヤ
// res[1]はaを、res[0]はbを追従
assign res = {a, b};

wire [2:0] c;
wire [7:0] res1;
// res[0]はc[2]を追従
// res[2:1]は常に0
// res[4:3]はc[1:0]を追従
// res[5]はaを追従
// res[6]はbを追従
assign res1 = {b, a, c[1:0], 2'b00, c[2]};

入力を連結して異なる出力を形成する動作例です。連結式は単に表示したり、ワイヤや変数に代入したりできます(必ずしも出力でなくてもよい)。

module des (input [1:0] a, input [2:0] b, output [4:0] out1, output [3:0] out2);
assign out1 = {a, b};
assign out2 = {a[1], 2'b01, b[2]};
endmodule

module tb;
reg [1:0] a;
reg [2:0] b;
wire [4:0] out1;
wire [3:0] out2;
des u0 (a, b, out1, out2);
initial begin
    a <= 0; b <= 0;
    $monitor("[%0t] a=%b b=%b, out1=%b out2=%b", $time, a, b, out1, out2);
    #10 a <= 3; #5 b <= 5; #10 a <= 2; #5 b <= 1; #10 $finish;
end
endmodule

out2[2:1] は常に定数 2'b01 です。

シミュレーションログ

xcelium> run
[0] a=00 b=000, out1=00000 out2=0010
[10] a=11 b=000, out1=11000 out2=1010
[15] a=11 b=101, out1=11101 out2=1011
[25] a=10 b=101, out1=10101 out2=1011
[30] a=10 b=001, out1=10001 out2=1010
Simulation complete via $finish(1) at time 40 NS + 0

複製演算子

同じ式を複数回繰り返す場合、複製定数 を使います。これは非負の数でなければならず、X、Z、変数は不可。この定数も波括弧で元の連結演算子と共に囲み、式が繰り返される総回数を指定します。

wire a;
wire [6:0] res;
assign res = {7{a}};

{2'bz{2'b0}}  // 違法: 複製定数にZ不可
{2'bx{2'b0}}  // 違法: 複製定数にX不可

複製式は代入の左辺に現れず、output または inout ポートに接続できません。

module des;
reg [1:0] a;
reg [2:0] b;
initial begin
    a <= 2; b <= 4;
    #10;
    $display("a=%b b=%b res=%b", a, b, {{2{a}}, {3{b}}});
end
endmodule

a が2回、b が3回繰り返されます。

シミュレーションログ

xcelium> run
a=10 b=100 res=1010100100100
xmsim: *W,RNQUIE: Simulation is complete.

複製式が実行されるとオペランドは1回だけ評価され、定数が0でも同様です。

ネストされた複製

複製式は通常の連結式内で使用可能です。上記例をベースに、a と b を全体の連結式に含めます。

module des;
reg [1:0] a;
reg [2:0] b;
initial begin
    a <= 2; b <= 4;
    #10;
    $display("a=%b b=%b res=%b", a, b, {a, b, 3'b000, {{2{a}}, {3{b}}}});
end
endmodule

シミュレーションログ

xcelium> run
a=10 b=100 res=101000001010100100100
xmsim: *W,RNQUIE: Simulation is complete.

違法な使用

module des;
reg [1:0] a;
reg [2:0] b;
reg [3:0] _var;
initial begin
    a <= 2; b <= 4; _var <= 3;
    // 違法: 変数を複製定数として使用不可
    $display("a=%b b=%b res=%b", a, b, {_var{a}});
end
endmodule

以下のコンパイルエラーになります。

Top level design units: des
$display("a=%b b=%b res=%b", a, b, {_var{a}});
| xmelab: *E,NOTPAR (./testbench.sv,12|45): Illegal operand for constant expression [4(IEEE)].

Verilog

  1. Verilogマスター:デジタル回路設計のための完全チュートリアル
  2. Verilog代入文の理解:種類、構文、ベストプラクティス
  3. Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
  4. Verilog関数のマスター:効率的なRTL設計のために
  5. Verilogタスクの理解:関数との違い、構文、使用法
  6. Verilogクロックジェネレータ:設計と実装ガイド
  7. Verilog数学関数のマスター:効率的なハードウェア設計のために
  8. Verilog $timeformatのマスター:精度と表示制御
  9. 任意のスコープでのVerilog timescale理解と表示
  10. VerilogファイルI/Oの完全ガイド:オープン、読み取り、書き込み、クローズ
  11. Verilog入門:Hello World例で基本をマスター