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"



All Articles