忍者ブログ

EDA Blog

Verilog、SystemVerilog、SystemCなど、ハードウェア記述言語についてのブログです。

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

[SystemVerilog] SystemVerilog for Verification

一昨年購入したSystemVerilog for Verificationを読んでいます。

Chapter 6: Randomizationを読みながら、ModelSim-Alteraでサンプルコードを試してみたのですが、残念ながらModelSimではランダム機能はサポートされていません。
下記のワーニングが出力されてしまいます。
** Warning: pp144.v(15): (vlog-2186) SystemVerilog testbench feature
(randomization, coverage or assertion) detected in the design.
These features are only supported in Questasim.
ランダム、カバレッジ、アサーションはQuestaでのみサポートされているそうです。
趣味程度の検証ではこれらの機能は使わないとは思いますが、SystemVerilogで強化された検証機能を体験したかっただけに残念です。

拍手[0回]

PR

[SyetemVerilog] SystemVerilog for Design (1)

SystemVerilog for Designを一通り読み終えたので、コードを書きつつModelSimを使ってSystemVerilogを勉強していこうと思います。

まずは、Chapter 2で出てくるpackageです。
definitionsというパッケージをdefinitions.sv内に定義します。
package definitions;
parameter VERSION = "1.0";

typedef enum {ADD, SUB, MUL} opcodes_t;

typedef struct {
logic [31:0] a, b;
opcodes_t opcode;
} instruction_t;

function automatic [31:0] multiplier (input [31:0] a, b);
return a * b;
endfunction // multiplier
endpackage // definitions


パッケージdefinitionsの定義を使用するモジュールALMALU.svに記述します。
module ALU (
input definitions::instruction_t IW,
input logic clock,
output logic [31:0] result
);

always_ff @(posedge clock) begin
case(IW.opcode)
definitions::ADD : result = IW.a + IW.b;
definitions::SUB : result = IW.a - IW.b;
definitions::MUL : result = definitions::multiplier(IW.a, IW.b);
endcase // case (IW.opcode)
end
endmodule // ALU

最後に、単純なテストベンチをALU_test.svに記述します。
import definitions::*;

module ALU_tb;
parameter PERIOD = 10;

logic clock;
instruction_t IW;
wire [31:0] result;

initial begin
clock = 1'b0;
IW.opcode = ADD;
IW.a = 32'b0;
IW.b = 32'b0;

repeat (5) @(negedge clock);

IW.a = 32'hdeadbeef;
IW.b = 32'b1;

@(negedge clock) IW.opcode = SUB;
@(negedge clock) IW.opcode = MUL;
@(negedge clock);

#1 $finish;
end

always #(PERIOD/2)
clock <= ~clock;

ALU DUT ( .* );
endmodule // ALU_tb

ModelSimでは、下記のコマンドでコンパイル・実行します。-svオプションをつけることで、SystemVerilogキーワードを認識してくれます。
vlib work
vlog -sv definitions.sv ALU_test.sv ALU.sv
vsim -c -do "add wave *; run 1us" ALU_tb


波形は下図のようになります。
enumで宣言したopcodes_t型の変数は、enum定義のまま表示されているので分かりやすいです。
waveform_030709.png

拍手[0回]

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

フリーエリア

最新CM

[04/11 なつたん]

最新TB

プロフィール

HN:
aston_martin
性別:
非公開

ブログ内検索

カウンター

アクセス解析