SystemVerilog рднрд╛рд╖рд╛ рдирд╡рд╛рдЪрд╛рд░

рдЫрд╡рд┐

рдпрд╣ рдЖрд▓реЗрдЦ рднрд╛рд╖рд╛ рдХреЗ рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рд╕рдмрд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рд╡реЗрд░рд┐рд▓реЙрдЧ -2001 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧрдарди рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ SystemVerilog рдХреЗ рдХреБрдЫ рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

SystemVerilog рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рд▓рдВрдмрд╛рдИ рдФрд░ рдзреВрдорд┐рд▓ рд╣реИред рд╡реЗрд░рд┐рд▓реЛрдЧ -95 рдорд╛рдирдХ рдХреЛ рдЕрдкрдирд╛рдиреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ, рдЗрд╕рдХрд╛ рд╕рдорд╛рдкрди рд╡реЗрд░рд┐рд▓реЛрдЧ-2001 рдореЗрдВ рд╣реБрдЖред рд╣рд╛рд▓рд╛рдВрдХрд┐, рднрд╛рд╖рд╛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рдереА, "рдИ" рдкрд░рд┐рд╡рд╛рд░ рдХреА рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрдВрдЬреАрдирд┐рдпрд░ - рд╡реАрдИрдЖрд░рдП, рдЯреЗрд╕реНрдЯрдмреНрдпреВрдбрд░ред рдЕрдкрдиреЗ рдЖрдзреБрдирд┐рдХ рд░реВрдк рдореЗрдВ, SystemVerilog 2005 рдХреЗ рдмрд╛рдж рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдЕрдм рд╕рдВрд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдг рдФрд░ рдореЙрдбрд▓рд┐рдВрдЧ рдЬреИрд╕реЗ рдХрд┐ рдХреНрд╡рд╛рд░реНрдЯрд╕ II, ISE, ModelSim / QuestaSim рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рд╕реЗ SystemVililog рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдорд╛рдирдХ рдХреЛ IEEE 1800-2012 рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рд▓рдЧрднрдЧред рдпрд╣ рд▓реЗрдЦ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред


SystemVerilog рд╡реЗрд░рд┐рд▓реЙрдЧ рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рдирдП рджрд┐рд▓рдЪрд╕реНрдк рдбрд┐рдЬрд╛рдЗрди рд▓реЗрдХрд░ рдЖрдпрд╛ рд╣реИ:


рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рддрд░реНрдХред


рдЕрдм рд░реЗрдЧ рдФрд░ рддрд╛рд░ рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд░ рдЬрдЧрд╣ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝рд░ рддрдп рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (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"

Source: https://habr.com/ru/post/In221265/


All Articles