0% found this document useful (0 votes)
50 views

Coding Interview Questions

The SystemVerilog code defines a class "sample" with a 10-bit random variable "x" and a constraint to ensure x has more than one bit set to 1 but no two adjacent bits. A testbench instantiates an object of this class and randomizes it twice to generate random 10-bit numbers meeting the constraint.

Uploaded by

Ankit Kumar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
50 views

Coding Interview Questions

The SystemVerilog code defines a class "sample" with a 10-bit random variable "x" and a constraint to ensure x has more than one bit set to 1 but no two adjacent bits. A testbench instantiates an object of this class and randomizes it twice to generate random 10-bit numbers meeting the constraint.

Uploaded by

Ankit Kumar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 12

1. Write a Verilog to generate the three times multiplication table.

// Define a module that generates the three times multiplication table


module ThreeTimesTable(
input clk, // Clock input for synchronization
input reset, // Reset input to initialize or restart the table
generation
output reg [7:0] result, // 8-bit output for the multiplication result
output reg [3:0] index // 4-bit output for the current multiplier index
);

reg [3:0] counter; // 4-bit counter used as multiplier

// Process block triggered on the rising edge of the clock


always @(posedge clk) begin
if (reset) begin
// Resetting the counter, result, and index to 0
counter = 4'b0000; // Initialize counter with a 4-bit width for
consistency
result <= 8'b00000000; // Reset result to 0
index <= 4'b0000; // Reset index to 0
end else if (counter < 10) begin
// On each clock cycle, increment the counter and calculate the new
result
counter <= counter + 1; // Increment counter
result <= counter * 3; // Calculate three times the counter
index <= counter; // Update the index to current counter value
end
end
endmodule

// Testbench module to simulate the ThreeTimesTable module


`timescale 1ns/1ps

module tb_three_times_table;

// Inputs to the module


reg clk;
reg reset;

// Outputs from the module


wire [7:0] result;
wire [3:0] index;

// Instantiate the ThreeTimesTable module


ThreeTimesTable uut (
.clk(clk),
.reset(reset),
.result(result),
.index(index)
);

// Clock generation process


initial begin
clk = 0; // Initialize clock to low
forever #5 clk = ~clk; // Toggle clock every 5 time units
end
// Test stimulus process
initial begin
// Monitor output on each clock cycle
$monitor("Time=%t, 3 * %d = %d", $time, index, result);

// Initialize the simulation with a reset


reset = 1; // Apply reset
#10; // Wait for 10 time units
reset = 0; // Release reset

// Wait for 100 time units to observe the outputs


#100;

// Stop the simulation


$stop;
end
endmodule

2. Write a Verilog code to implement a counter that cycles through two distinct ranges based
on a mode: initially counting from 5 to 12, and then, upon reaching the end of this range,
switching to count from 0 to 15.

module counter (
input wire clk, // Clock input
input wire reset, // Reset signal input
output reg [3:0] count // Output: 4-bit counter (5 to 12, then 0 to 15)
);

// State variable to indicate the mode: 0 for 5 to 12, 1 for 0 to 15


reg mode;

always @(posedge clk or posedge reset) begin


if (reset) begin
count <= 4'b0101; // Reset the counter to 5
mode <= 1'b0; // Set mode to 5 to 12 counting
end else begin
if (mode == 1'b0) begin
if (count < 4'b1100) begin
count <= count + 1; // Increment the counter from 5 to 12
end else begin
count <= 4'b0000; // Reset the counter to 0 when it
reaches 12
mode <= 1'b1; // Switch to 0 to 15 counting mode
end
end else begin
if (count < 4'b1111) begin
count <= count + 1; // Increment the counter from 0 to 15
end else begin
count <= 4'b0000; // Reset the counter to 0 when it
reaches 15
end
end
end
end

endmodule

module tb_counter;

// Inputs
reg clk;
reg reset;

// Outputs
wire [3:0] count;

// Instantiate the counter module


counter counter_inst (
.clk(clk),
.reset(reset),
.count(count)
);

// Clock generation
always begin
#5 clk = ~clk; // Toggle the clock every 5 time units
end

// Testbench logic
initial begin
// Initialize inputs
clk = 0;
reset = 0;

// Apply reset for the first few clock cycles


#10 reset = 1;
#10 reset = 0;

// Monitor the counter value for 50 time units


// Display the value each time it changes
$monitor("Time=%t, Count=%d", $time, count);
#500 $finish; // End the simulation after 50 time units
end

endmodule
3. Write a Verilog module that determines if a given number is even or odd, and outputs a
result of 1 for even numbers and 0 for odd numbers using function.
module Test;
// Define a function named isEvenOrOdd which takes an input 'a' and returns
a bit indicating if the number is even or odd
function bit isEvenOrOdd(input logic a);
bit result; // Declare a variable 'result' of type bit

// Check if the input number is divisible by 2


if (a % 2 == 0)
result = 1; // Set result to 1 if the number is even
else
result = 0; // Set result to 0 if the number is odd

return result; // Return the result


endfunction

// Initial block to execute code at the beginning of simulation


initial
begin
bit result; // Declare a variable 'result' of type bit
logic input_value = 10; // Declare and initialize an input value

// Call the isEvenOrOdd function with input_value and store the result
result = isEvenOrOdd(input_value);

// Display the input value and the result


$display("Input: %0d, Result: %0d", input_value, result);
end
endmodule

4. Write a SystemVerilog code to identify and display numbers divisible by 8 within the range
of 0 to 100?
// Define a SystemVerilog class named DivisibleByEight
class DivisibleByEight;
// Method to find and display numbers divisible by 8
static function void findDivisibleByEight();
// Loop through numbers from 0 to 100
for (int i = 0; i <= 100; i++) begin
// Check if the current number is divisible by 8
if (i % 8 == 0)
// If divisible by 8, display the number
$display("Number %0d is divisible by 8", i);
end
endfunction
endclass

// Testbench module
module TestBench;
// Initial block to execute at the beginning of simulation
initial begin
// Call the findDivisibleByEight method of the DivisibleByEight class
DivisibleByEight::findDivisibleByEight();
// Finish simulation
$finish;
end
endmodule

5. Write a SystemVerilog program that utilizes a function to calculate the sum of two numbers
and determine whether the result is odd or even.
class packet;
rand bit[31:0] data; // Declare a random 32-bit data variable
rand bit[31:0] addr; // Declare a random 32-bit address variable
rand bit [31:0] sum; // Declare a random 32-bit sum variable

// Constructor for the 'packet' class


function new (int data, int b);
this.data = data; // Assign the input 'data' to the class data variable
addr = b; // Assign the input 'b' to the class address variable
sum = data + addr; // Calculate the sum of data and address and assign it
to the class sum variable

// Check if the sum is odd or even and display the result


if (sum % 2 == 1)
$display("Sum is ODD");
else
$display("Sum is EVEN");
endfunction
endclass

// Define a testbench module named 'tb'


module tb;
initial
begin
// Create an instance of the 'packet' class with data=10 and address=20
packet pkt = new(10, 20);

// Display the data and address of the 'pkt' instance


$display("DATA = %0d, ADDR = %0d", pkt.data, pkt.addr);

// Display the sum of data and address in the 'pkt' instance


$display("SUM = %0d", pkt.sum);
end
endmodule
6. Check output is high within in 20ns.
module test;
timeunit 1ns;
timeprecision 100ps;

// Declare input/output signals and a reset signal


bit a, b, y, reset = 1;

property data;
// Waits for a rising edge on both a and b signals, disables if reset is
low
@(posedge(a && b)) disable iff (reset == 0)
// Upon event, execute the following sequence
(1, set()); // Call the set task
endproperty

task automatic set();


// Declare a variable to store real-time
realtime t;

// Start parallel execution


fork
// Wait for transition on signals a and b, then record the current time
@(a && b) t = $realtime;

// Wait for 20 ns
#20;

join_any
// If y becomes 1 within 20ns, assert the condition
am_aby: assert(y == 1)
// Display the time taken for y to go high
$display("y went to 1 after %t", $realtime - t);
else
// If y does not become 1 within 20ns, display a message
$display("y did not go to 1 within 20ns");
endtask

// Initial block to finish simulation after 100ns


initial
begin
#100;
$finish;
end
endmodule
7. How can you define a constraint in SystemVerilog to generate a 10-bit number where more
than one bit is set to 1, but no two set bits are adjacent to each other?
// Define a class named "sample"
class sample;
rand bit [9:0] x; // Declare a 10-bit random variable x

// Define a constraint named "c"


constraint c
{
$countones(x) > 1; // Ensure x has more than one bit set to 1
foreach(x[i]) // Iterate through each bit of x
{
// If the current bit is set and is not the last bit in x,
// ensure the next bit is not set (i.e., no two adjacent bits are set)
if(i < 9 && x[i] == 1)
x[i+1] != 1;
}
};
endclass

// Testbench module to instantiate and test the "sample" class


module tb;
sample s = new(); // Instantiate an object of class sample

initial begin
repeat(2) begin // Generate and display the random value twice
s.randomize(); // Randomize the object s according to its constraints
$display("%b", s.x); // Display the generated 10-bit number in binary
end
end
endmodule

8. Write the constraint to gen. this seq. 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 1 0 2 0 3 0 4 0 5


... in array.

// Define a SystemVerilog class named sample


class sample;
// Declare a rand array of 8-bit elements
rand bit[7:0] array[];

// Constraint block to constrain the properties of the array


constraint array_c {
// Constraint to limit the size of the array between 20 and 30 elements
array.size() inside {[20:30]};

// Loop through each element of the array


foreach(array[i]) {
// Constrain even-indexed elements to be 0
if (i % 2 == 0)
array[i] == 0;
// Constrain the first element to be 1
else if (i == 1)
array[i] == 1;
// Constrain elements at multiples of 19 to be 1
else if (i % 19 == 0)
array[i] == 1;
// Constrain other elements to increment by 1 compared to the previous
odd-indexed element
else
array[i] == array[i-2] + 1;
}
}
endclass

// Define a top-level module named top


module top;
// Instantiate an object of the sample class
sample s = new();

// Initial block to execute at the beginning of simulation


initial begin
// Repeat the simulation 5 times
repeat(5) begin
// Randomize the properties of the sample object and assert success
assert(s.randomize());
// Display the randomized array
$display("array = %p", s.array);
end
end
endmodule

9. Constraint that should follow the below Rules


I. The dynamic array should contain 20 items.
II. Out of 20 items, the values of 3 items should be equal to 5 at random positions.
III. The values of 5 items must be 10 at random positions
IV. The values of 8 items must be 15 and the remaining 4 items must be 20.
// Define a SystemVerilog class named test
class test;
// Declare a rand array of 5-bit elements
rand bit[4:0] array[];

// Constraint block to constrain the properties of the array


constraint c1{
// Constraint to ensure the size of the array is 20
array.size == 20;
// Constraint to ensure the sum of elements equal to 5 occurs 3 times
array.sum() with ((item == 5) ? 1 : 0) == 3;
// Constraint to ensure the sum of elements equal to 10 occurs 5 times
array.sum() with ((item == 10) ? 1 : 0) == 5;
// Constraint to ensure the sum of elements equal to 15 occurs 8 times
array.sum() with ((item == 15) ? 1 : 0) == 8;
// Constraint to ensure the sum of elements equal to 20 occurs 4 times
array.sum() with ((item == 20) ? 1 : 0) == 4;
}
endclass

// Define a top-level module named sum


module sum;
// Instantiate an object of the test class
test t1;

// Initial block to execute at the beginning of simulation


initial begin
// Create a new object of the test class
t1 = new;
// Randomize the properties of the test object and assert success
assert(t1.randomize);
// Display the randomized array
$display("array = %p", t1.array);
// Sort the array for better understanding
t1.array.sort();
// Display the array after sorting
$display("\narray value after sorting for understanding\narray = %p",
t1.array);
end
endmodule

10. Write a constraint for an array of numbers such that the size of array ranges from 6 to 15
elements, and even index locations should have odd numbers and odd index locations
should have even numbers, numbers rage is between 16 to 127.
// Define a SystemVerilog class named packet
class packet;
// Declare a rand array of 7-bit elements
rand bit[6:0] array[];

// Constraint block to constrain the properties of the array size


constraint array_c {
array.size() inside {[6:15]}; // Constraint to limit the size of the
array between 6 and 15 elements
}

// Constraint block to constrain the range of elements in the array


constraint elements {
foreach (array[i])
array[i] inside {[16:127]}; // Constraint to limit each element to the
range between 16 and 127
}
// Constraint block to ensure even-indexed elements are odd and odd-indexed
elements are even
constraint even {
foreach(array[i]) begin
if (i % 2 == 1) // For odd-indexed elements
array[i] % 2 == 0; // Constrain to be even
else // For even-indexed elements
array[i] % 2 != 0; // Constrain to be odd
end
}
endclass

// Define a test module


module test;
// Instantiate an object of the packet class
packet pkt;

// Initial block to execute at the beginning of simulation


initial begin
// Create a new object of the packet class
pkt = new;
// Repeat the simulation 5 times
repeat(5) begin
// Randomize the properties of the packet object
pkt.randomize();
// Display the values of the array
$display("The values of odd and even: %p", pkt);
end
end
endmodule

/or/

// Define a SystemVerilog class named sample


class sample;
// Declare a rand array of 7-bit elements
rand bit[6:0] array[];

// Constraint block to constrain the properties of the array


constraint array_c {
// Constraint to limit the size of the array between 6 and 15 elements
array.size() inside {[6:15]};

// Iterate through each element of the array


foreach(array[i]) {
// Constraint to limit each element to the range between 16 and 127
array[i] inside {[16:127]};

// Constrain the most significant bit (MSB) of each element based on


the index parity
if (i[0] == 0)
array[i][0] == 1; // Set MSB to 1 for even-indexed elements
else
array[i][0] == 0; // Set MSB to 0 for odd-indexed elements
}
}
endclass

// Define a top-level module named top


module top;
// Instantiate an object of the sample class
sample s = new();

// Initial block to execute at the beginning of simulation


initial begin
// Repeat the simulation 5 times
repeat (5) begin
// Randomize the properties of the sample object
s.randomize();
// Display the randomized array
$display("array = %p", s);
end
end
endmodule

You might also like