// followings are sample codes of "Verilog-2001 Code Book"
// Test for "Cyclone III EP3C25F324C6"
// top module for test
module shift_mul(
input [15:0] in_p,
input [3:0] shift_p,
output reg [17:0] result_p,
output reg error_p,
input clock);
reg [15:0] in;
reg [3:0] shift;
wire [17:0] result;
wire error;
always@(posedge clock) begin
in <= in_p;
shift <= shift_p;
result_p <= result;
error_p <= error;
end
// unsigned_shift_left_1 u1(.in(in), .result(result[16:0]));
assign error = 1'b0; assign result[17] = 1'b0;
// unsigned_shift_left_1_clip u1(.in(in), .result(result[15:0]),
.error(error)); assign result[17:16] = 2'b0;
signed_shift_left_variable_clip u1(.in(in), .shift(shift), .result(result[15:0]),
.error(error)); assign result[17:16] = 2'b0;
endmodule
// unsigned shift
module unsigned_shift_left_1(
input [15:0] in,
output [16:0] result);
assign result = {in, 1'b0};
endmodule
module unsigned_shift_left_1_clip(
input [15:0] in,
output [15:0] result,
output error);
wire [16:0] work = {in, 1'b0};
assign error = work[16];
assign result = error ? 16'hFFFF : work[15:0];
endmodule
module unsigned_shift_right_1(
input [15:0] in,
output [15:0] result);
assign result = {1'b0, in[15:1]};
endmodule
module unsigned_shift_right_variable(
input [15:0] in,
input [3:0] shift,
output [15:0] result);
wire [15:0] work0 = shift[0] ? {1'b0, in[15:1]} : in;
wire [15:0] work1 = shift[1] ? {2'b0, work0[15:2]} : work0;
wire [15:0] work2 = shift[2] ? {4'b0, work1[15:4]} : work1;
assign result = shift[3] ? {8'b0, work2[15:8]} : work2;
endmodule
// signed shift
module signed_shift_right_1(
input [15:0] in,
output [15:0] result);
assign result = {in[15], in[15:1]};
endmodule
module signed_shift_left_1_clip(
input [15:0] in,
output [15:0] result,
output error);
assign error = ^in[15:14];
assign result = error ? (in[15] ? 16'h8000 : 16'h7FFF)
: {in[14:0], 1'b0};
endmodule
module signed_shift_right_variable(
input [15:0] in,
input [3:0] shift,
output [15:0] result);
wire [15:0] work0 = shift[0] ? {in[15], in[15:1]} : in;
wire [15:0] work1 = shift[1] ? {{2{work0[15]}}, work0[15:2]} : work0;
wire [15:0] work2 = shift[2] ? {{4{work1[15]}}, work1[15:4]} : work1;
assign result = shift[3] ? {{8{work2[15]}}, work2[15:8]} : work2;
endmodule
module signed_shift_left_variable_clip(
input [15:0] in,
input [3:0] shift,
output [15:0] result,
output error);
wire [16:0] work0 = shift[0] ? {in, 1'b0} : {1'b0, in};
wire [18:0] work1 = shift[1] ? {work0, 2'b0} : {2'b0, work0};
wire [22:0] work2 = shift[2] ? {work1, 4'b0} : {4'b0, work1};
wire [30:0] work3 = shift[3] ? {work2, 8'b0} : {8'b0, work2};
assign error = ~&work3[30:15] & |work3[30:15];
assign result = error ? (work3[30] ? 16'h8000 : 16'h7FFF)
: work3[15:0];
endmodule
// multiplier
module unsigned_mul_5(
input [15:0] in,
output [17:0] result);
assign result = {in, 2'b0} + {2'b0, in};
endmodule