Write a SystemVerilog code for a 4-bit ripple carry adder with carry-in and carry-out.

Sure, here’s an example of a 4-bit ripple carry adder with carry-in and carry-out implemented using SystemVerilog:

module ripple_carry_adder_4bit(
  input logic [3:0] a,
  input logic [3:0] b,
  input logic cin,
  output logic [3:0] sum,
  output logic cout
);

  logic [3:0] carry;

  assign carry[0] = cin;

  generate
    for (genvar i = 1; i < 4; i++) begin
      assign carry[i] = (a[i-1] & b[i-1]) | (a[i-1] & carry[i-1]) | (b[i-1] & carry[i-1]);
    end
  endgenerate

  assign sum = a + b + cin;
  assign cout = carry[3];

endmodule

In this code, we define a module called `ripple_carry_adder_4bit` with three input ports `a`, `b`, and `cin`, and two output ports `sum` and `cout`. The `a` and `b` inputs are 4-bit binary values to be added, the `cin` input is a single-bit binary value representing the carry-in signal, the `sum` output is a 4-bit binary value representing the sum of `a`, `b`, and `cin`, and the `cout` output is a single-bit binary value representing the carry-out signal.

The `carry` signal is a 4-bit binary value representing the carry bits generated during the addition operation.

Inside the `generate` block, we use a `for` loop to generate the carry values for each bit position. The carry value for each bit position is calculated using the standard carry formula: `carry[i] = (a[i-1] & b[i-1]) | (a[i-1] & carry[i-1]) | (b[i-1] & carry[i-1])`, where `a[i-1]` and `b[i-1]` are the input bits for the `i`-th bit position, and `carry[i-1]` is the carry value for the previous bit position.

The `sum` output is calculated using the built-in addition operator (`+`) for SystemVerilog, which adds the input values `a`, `b`, and `cin`.

The `cout` output is set to the value of the carry-out bit (`carry[3]`) generated during the addition operation.

You can instantiate this module in your top-level design hierarchy and connect it to other modules or input/output signals as needed. Note that you can modify the code to implement a wider or narrower adder by changing the bit width of the input and output signals.