рдпрд╣ рдЖрд▓реЗрдЦ рднрд╛рд╖рд╛ рдХреЗ рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рд╕рдмрд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рд╡реЗрд░рд┐рд▓реЙрдЧ -2001 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧрдарди рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ SystemVerilog рдХреЗ рдХреБрдЫ рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
SystemVerilog рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рд▓рдВрдмрд╛рдИ рдФрд░ рдзреВрдорд┐рд▓ рд╣реИред рд╡реЗрд░рд┐рд▓реЛрдЧ -95 рдорд╛рдирдХ рдХреЛ рдЕрдкрдирд╛рдиреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ, рдЗрд╕рдХрд╛ рд╕рдорд╛рдкрди рд╡реЗрд░рд┐рд▓реЛрдЧ-2001 рдореЗрдВ рд╣реБрдЖред рд╣рд╛рд▓рд╛рдВрдХрд┐, рднрд╛рд╖рд╛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рдереА, "рдИ" рдкрд░рд┐рд╡рд╛рд░ рдХреА рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрдВрдЬреАрдирд┐рдпрд░ - рд╡реАрдИрдЖрд░рдП, рдЯреЗрд╕реНрдЯрдмреНрдпреВрдбрд░ред рдЕрдкрдиреЗ рдЖрдзреБрдирд┐рдХ рд░реВрдк рдореЗрдВ, SystemVerilog 2005 рдХреЗ рдмрд╛рдж рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдЕрдм рд╕рдВрд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдг рдФрд░ рдореЙрдбрд▓рд┐рдВрдЧ рдЬреИрд╕реЗ рдХрд┐ рдХреНрд╡рд╛рд░реНрдЯрд╕ II, ISE, ModelSim / QuestaSim рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рд╕реЗ SystemVililog рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдорд╛рдирдХ рдХреЛ IEEE 1800-2012 рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓рдЧрднрдЧред рдпрд╣ рд▓реЗрдЦ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
SystemVerilog рд╡реЗрд░рд┐рд▓реЙрдЧ рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рдирдП рджрд┐рд▓рдЪрд╕реНрдк рдбрд┐рдЬрд╛рдЗрди рд▓реЗрдХрд░ рдЖрдпрд╛ рд╣реИ:
- рд╕реА-рд▓рд┐рд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕
- PLO
- рд╕рдВрд░рдЪрдирд╛рдПрдВ, рдХрддрд╛рд░реЗрдВ, рдЧрддрд┐рд╢реАрд▓ рд╕рд░рдгрд┐рдпрд╛рдБ, рдЧрдгрдирд╛
- рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯ рдХрд░реЗрдВ
- рдлрд╝реЙрд░реНрдЪ, рд╡рд╛рдкрд╕реА, рдмреНрд░реЗрдХ, рдЬрд╛рд░реА, рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ред
- рд╕реЗрдорд╛рдлреЛрд░, рдореЗрд▓рдмреЙрдХреНрд╕ред
- рдЗрдВрдЯрд░рдлреЗрд╕
- рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ
рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рддрд░реНрдХред
рдЕрдм рд░реЗрдЧ рдФрд░ рддрд╛рд░ рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд░ рдЬрдЧрд╣ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рддрдп рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (VHDL рд╕реЗ рдЙрдЪреНрдЪ рд╕рдВрдХреЗрдд)ред
рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдЯрд╛рдЗрдк рдХрд░реЗрдВ
SystemVerilog рдмреЗрд╣рддрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд░рдВрднрд┐рдХ рдХреНрд╖рдорддрд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЕрдм рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ
reg [63:0] data = 64'hFFFFFFFFFFFFFFFF;
рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
reg [63:0] data = '1;
рдбреЗрдЯрд╛ рд▓рд┐рдЦрдирд╛ = '0 рдЬреАрд░реЛ рдХреЗ рд╕рд╛рде рд╡реЗрдХреНрдЯрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ, рдФрд░ рдбреЗрдЯрд╛ =' bz рдерд░реНрдб рд╕реНрдЯреЗрдЯ рдХреЗ рд╕рд╛рде
рдкреНрд░рдЧрдгрд┐рдд рдкреНрд░рдХрд╛рд░ред
рдЕрдВрдд рдореЗрдВ, рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЛ рдЗрд╕ рддрд░рд╣ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
enum {WAITE, LOAD, STORE} State, NextState; always_ff @(posedge clock, negedge resetN) if (!resetN) State <= WAITE; else State <= NextState; always_comb begin case (State) WAITE: NextState = LOAD; LOAD: NextState = STORE; STORE: NextState = WAITE; endcase end
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдПрдХ рдПрдиреНрдпреВрдорд░реЗрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
enum {ONE = 1,FIVE = 5,TEN = 10 } state;
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдПрдХ рдПрдиреНрдпреВрдорд░реЗрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдЕрдВрддрд░ рдорд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ
// 1 рдмрд┐рдЯ рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреЗ рд╕рд╛рде рдкреНрд░рдЧрдгрд┐рдд рдкреНрд░рдХрд╛рд░ред
// рдХреЗрд╡рд▓ рджреЛ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
enum bit {TRUE, FALSE} Boolean; // 2 . // enum logic [1:0] {WAITE, LOAD, READY} state;
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдиреНрдпреВрдорд░реЗрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
$display("\nCurrent state is %s (%b)", State.name);
Strukruty
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ:
struct { int a, b; // 32-bit variables opcode_t opcode; // user-defined type logic [23:0] address; // 24-bit variable bit error; // 1-bit 2-state var. } Instruction_Word;
рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЯрдВрдХрдг рдХреА рдШреЛрд╖рдгрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛
typedef struct { // structure definition logic [31:0] a, b; logic [ 7:0] opcode; logic [23:0] address; } instruction_word_t; instruction_word_t IW; // structure allocation
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рдВрд░рдЪрдирд╛ рдЕрдирдкреИрдХреНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИред рдкреИрдХреНрдб рдХреАрд╡рд░реНрдб рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкреИрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
struct packed { logic valid; logic [ 7:0] tag; logic [31:0] data; } data_word;
рдЗрд╕ рд░реВрдк рдореЗрдВ, рдЗрд╕реЗ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдРрд╕реЗ рдирд┐рд░реНрдорд╛рдг рд╕рдВрднрд╡ рд╣реИрдВред
data_word.tag = 8'hf0; data_word[39:32] = 8'hf0; //
рд╕рдВрдШ рд╕рдВрдШ
рдПрдХ рд╕рдВрдШ рдПрдХ рдореЗрдореЛрд░реА рдореВрд▓реНрдп рд╣реИ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХред
рд╡рд╛рдХреНрдп рд╡рд┐рдиреНрдпрд╛рд╕ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реА-рд▓рд╛рдЗрдХ рд╣реИред
union { int i; int unsigned u; } data; ... data.i = -5; $display("data is %d", data.i); data.u = -5; $display("now data is %d", data.u);
рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реБрдЪрд┐ рдпреВрдирд┐рдпрдиреЛрдВ рд╕реЗ рднрд░реА рд╣реБрдИ рд╣реИред рд╡реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрд░реНрдЬ рдХреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рджреВрд╕рд░реЗ рд░реВрдк (рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░) рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
typedef struct packed { logic [15:0] source_address; logic [15:0] destination_address; logic [23:0] data; logic [ 7:0] opcode; } data_packet_t; union packed { data_packet_t packet; // packed structure logic [7:0][7:0] bytes; // packed array } dreg;
рдЪреВрдВрдХрд┐ рд╕рдВрдШ рдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрд░реЗрдЦрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рддрд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ [7: 0] рдХреЛ data_etett.t рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
initial begin logic [15:0] src, dst; for (i = 0; i <= N; i = i + 1) begin dreg.bytes[i] <= byte_in; //store as bytes end src = dreg.source_address; dst = dreg.destination_address; end
рдкреИрдХ рдХреА рдЧрдИ рд╕рд░рдгреА
SystemVerilog рдЖрдкрдХреЛ рдмрд╣реБрдЖрдпрд╛рдореА рдкреИрдХреНрдб рд╕рд░рдгрд┐рдпрд╛рдБ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
logic [3:0][7:0] data; // 2-D packed array logic [1:0][3:0][7:0] data; // 3-D packed array
IEEE рдорд╛рдирдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрди рддрддреНрд╡реЛрдВ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдХреИрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
logic [3:0][7:0] data; // 2-D packed array
рдЪреВрдВрдХрд┐ рд╕рд░рдгреА рдХреЛ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реИрдХреНрдЯрд░ рдкрд░ рд╕рднреА рд╕рдорд╛рди рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ
logic [3:0][15:0] a, b, result; // packed arrays result = (a << 1) + b;
рд╡реЗрдХреНрдЯрд░ рддрдХ рдкрд╣реБрдВрдЪ рдпрд╛ рддреЛ рддрддреНрд╡-рд╡рд╛рд░ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдпрд╛ рд╕рдВрдкреВрд░реНрдг рдЖрдпрд╛рдо (рдУрдВ) рд╕рд╣рд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИред рддрдерд╛рдХрдерд┐рдд рдЯреБрдХрдбрд╝рд╛ рд╕рд░рдгреАред
logic [1:0][1:0][7:0] a; // 3-D packed array a[1][1][0] = 1'b0; // a = 32'hF1A3C5E7; // a[1][0][3:0] = 4'hF; // a[0] = 16'hFACE; //
рдПрдХ рд╕рд░рдгреА рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдбрд╛рдпрд░реЗрдХреНрдЯ рдПрдХреНрд╕реЗрд╕ рдпрд╛ рд╕реНрд▓рд╛рдЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
bit [1:0][15:0] a; //32 , bit 0 1 logic [3:0][7:0] b; //32 , logic O,1,Z,X logic [15:0] c; // 16 logic [39:0] d; // 40 b = a; // 32 32 c = a; // 16 d = a; // 8
рд╕рдВрджрд░реНрдн
1. www.asic-world.com/systemverilog
2. рд╕реНрдЯреБрдЕрд░реНрдЯ рд╕рджрд░рд▓реИрдВрдб рджреНрд╡рд╛рд░рд╛ "SystemVerilog For Design Second Edition"