VLSI
VLSI
module boothmul(
input[3:0]multiplicand,
input[3:0]multiplier,
output reg[7:0]product
);
reg[3:0] A,Q,M;
reg Q_1;
integer i;
always@(multiplicand or multiplier)begin
A=4'b0;
M=multiplicand;
Q=multiplier;
Q_1=1'b0;
product=8'b0;
for(i=0;i<4;i=i+1)begin
case({Q[0],Q_1})
2'b01:A=A+M;
2'b10:A=A-M;
default: ;
endcase
{A,Q,Q_1}={A[3],A,Q};
end
product={A,Q};
end
endmodule
----------------------
module boothmul_tb;
reg[3:0] multiplicand;
reg[3:0] multiplier;
wire[7:0] product;
boothmul uut(.multiplicand(multiplicand),.multiplier(multiplier),.product(product));
initial begin
multiplicand=0;
multiplier=0;
//#10 multiplicand=4'b0011;multiplier=4'b0101;
//#10 multiplicand=4'b1101;multiplier=4'b1010;
#10 multiplicand=4'd4;multiplier=4'd3;
#10 multiplicand=4'd5;multiplier=4'd2;
#10 multiplicand=-4'd7;multiplier=4'd3;
#10 multiplicand=-4'd7;multiplier=4'd3;
$finish;
end
initial begin
$monitor($time,"multiplicand=%d,multiplier=%d,product=%d",multiplicand,multiplier,product);
end
endmodule
2, ALU
module alu (
input wire [3:0] a, // 4-bit input A
input wire [3:0] b, // 4-bit input B
input wire [2:0] op, // 3-bit operation selector
output reg [3:0] result, // 4-bit result
output reg carry_out, // Carry out for addition/subtraction
output reg zero // Zero flag
);
// Operation codes
parameter ADD = 3'b000;
parameter SUB = 3'b001;
parameter AND = 3'b010;
parameter OR = 3'b011;
parameter XOR = 3'b100;
parameter NOT = 3'b101;
module tb_alu;
reg [3:0] a;
reg [3:0] b;
reg [2:0] op;
wire [3:0] result;
wire carry_out;
wire zero;
alu uut (
.a(a),
.b(b),
.op(op),
.result(result),
.carry_out(carry_out),
.zero(zero)
);
// Test sequence
initial begin
// Initialize signals
a = 4'd0;
b = 4'd0;
op = 3'b000;
// Test Case 4: OR
a = 4'd7; b = 4'd3; op = 3'b011; // a | b = 7
#10;
4, MAC
module mac (
input wire clk,
input wire reset,
input wire [3:0] a,
input wire [3:0] b,
output reg [7:0] acc_out
);
module tb_mac;
reg clk;
reg reset;
reg [3:0] a;
reg [3:0] b;
wire [7:0] acc_out;
initial begin
// Initialize inputs
clk = 0;
reset = 1;
a = 4'd1;
b = 4'd2;
// Test Case 1
a = 4'd3; b = 4'd4; #10;
$display("At time=%t, a=%d, b=%d, acc_out=%d", $time, a, b, acc_out);
// Test Case 2
a = 4'd5; b = 4'd6; #10;
$display("At time=%t, a=%d, b=%d, acc_out=%d", $time, a, b, acc_out);
// Test Case 3
a = 4'd7; b = 4'd8; #10;
$display("At time=%t, a=%d, b=%d, acc_out=%d", $time, a, b, acc_out);
// Finish simulation
$finish;
end
5, UPC
module syn_counter(
input clk,
input reset,
input up_down,
output [3:0] counter
);
wire [3:0] d;
wire [3:0] q;
endmodule
(structural)
module counter (
input wire up_down, // Direction control: 1 for up, 0 for down
input wire clk, // Clock input
input wire rst, // Reset input
output reg [3:0] counter // 4-bit counter output
);
module tb_up_down_counter_structural;
reg clk;
reg reset;
reg up_down;
wire [3:0] counter;
initial begin
// Initialize signals
clk = 0;
reset = 1;
up_down = 0;
// End simulation
$stop;
end
// Monitor the counter value, up_down, reset, and clk for debugging
initial begin
$monitor("Time = %0t | Counter = %b | Up_Down = %b | Reset = %b | CLK = %b", $time,
counter, up_down, reset, clk);
end
endmodule
6, MEALY
// Clock generation
always #5 clk = ~clk;
initial begin
// Set up the waveform dump
$dumpfile("dump.vcd");
$dumpvars(1, testbench);
// Initialize inputs
clk = 1'b0;
reset = 1'b1;
#15 reset = 1'b0;
(structural)
module d_ff(
input d,
input clk,
input reset,
output reg q
);
always @(posedge clk or posedge reset) begin
if (reset)
q <= 0;
else
q <= d;
end
endmodule
module tb_UniversalShiftRegister_4bit;
reg clk;
reg reset;
reg [2:0] control;
reg serial_in_left;
reg serial_in_right;
reg [3:0] parallel_in;
wire [3:0] data_out;
// Clock generation
always #5 clk = ~clk;
initial begin
// Initialize inputs
clk = 0;
reset = 1;
control = 3'b000;
serial_in_left = 1;
serial_in_right = 0;
parallel_in = 4'b1010;
// Test left shift (SISO with serial input from the left)
control = 3'b001;
serial_in_left = 1;
#10;
// Test right shift (SISO with serial input from the right)
control = 3'b010;
serial_in_right = 0;
#10;
// Complete simulation
$stop;
end
initial begin
$monitor("Time = %0t | Control = %b | Data_out = %b | Serial_in_left = %b | Serial_in_right
= %b | Parallel_in = %b",
$time, control, data_out, serial_in_left, serial_in_right, parallel_in);
end
endmodule