Tuesday, December 9, 2025

packet generation question

 Q -> 

You have a SystemVerilog class that represents a network packet, with the following properties:

  • addr: a 32-bit integer representing the destination address
  • data: a 16-byte array of bytes representing the packet payload
  • proto: a 2-bit enumeration representing the protocol type (e.g. TCP, UDP, ICMP, etc.)

You want to write a constraint to ensure that:

  • The addr field is randomly assigned a value between 192.168.0.1 and 192.168.0.100 (inclusive)
  • The data field is randomly assigned a value, but with the following conditions:
    • At least 4 bytes of the payload must be non-zero
    • No more than 8 bytes of the payload can be zero
  • The proto field is randomly assigned one of the following values: TCP, UDP, or ICMP

Write a SystemVerilog constraint that satisfies these conditions.

=================================================================

// Define the enum for protocol type

typedef enum {TCP, UDP, ICMP} proto_e;


// Define the packet class with constraints

class packet;

    rand int addr;

    rand byte data[16];

    rand proto_e proto;

    int non_zero_count ;

    int zero_count ;


    // Constraints for packet fields

    constraint addr_c {

        addr inside {[32'hC0A80001 : 32'hC0A86401]}; // 192.168.0.1 to 192.168.0.100

    }



      constraint data_c {

        foreach (data[i]) {

            data[i] dist {0 := 50, [1:255] := 50}; // Uniform distribution for non-zero and zero bytes

        }

    }

    constraint proto_c {

        proto dist {TCP := 1, UDP := 1, ICMP := 1}; // Uniform distribution

    }


    // Method to print packet information

    function void print();

        $display("Packet Information:");

        $display("  Address: %d", addr);

        $display("  Data: ");

        foreach (data[i]) begin

            $display("    byte[%0d] = %d", i, data[i]);

        end

        case (proto)

            TCP: $display("  Protocol: TCP");

            UDP: $display("  Protocol: UDP");

            ICMP: $display("  Protocol: ICMP");

        endcase

    endfunction


endclass


// Testbench module

module tb;

    // Create a packet instance

    packet p;


    initial begin

        // Initialize the random seed

        //$random_seed = 1;


        // Create a new packet instance

        p = new();


        // Repeat the randomization and printing process

        repeat (10) begin

            // Randomize the packet fields

            if (!p.randomize()) begin

                $error("Failed to randomize packet");

            end


            // Print the packet information

            p.print();


            // Wait for 1ns before generating the next packet

            #1ns;

        end


        // Wait for 1ns before finishing the simulation

        #1ns;


        $finish;

    end

endmodule


No comments:

Post a Comment