// followings are sample codes of "Verilog-2001 Code Book" // Test for "Cyclone III EP3C25F324C6" module add_sub( input [15:0] ina_p, inb_p, output reg [31:0] result_p, output reg error_p, input clock); reg [15:0] ina, inb; wire [31:0] result; wire error; always @(posedge clock) begin ina <= ina_p; inb <= inb_p; result_p <= result; error_p <= error; end // test module difinition: erase only 1 comment of following lines // unsigned_add u1 (.ina(ina), .inb(inb), .result(result[16:0])); // assign {error, result[31:17]} = 16'h0; // unsigned_add_clip u1 (.ina(ina), .inb(inb), .result(result[15:0]), // .error(error)); assign result[31:16] = 16'h0; // unsigned_sub_clip u1 (.ina(ina), .inb(inb), .result(result[15:0]), // .error(error)); assign result[31:16] = 16'h0; // signed_add u1 (.ina(ina), .inb(inb), .result(result[16:0])); // assign {error, result[31:17]} = 16'h0; // signed_add_check_alt u1 (.ina(ina), .inb(inb), .result(result[15:0]), // .overflow(error)); assign result[31:16] = 16'h0; // signed_add_check u1 (.ina(ina), .inb(inb), .result(result[15:0]), // .overflow(error)); assign result[31:16] = 16'h0; signed_clip u1 (.in({ina, inb}), .result(result[15:0]), .error(error)); assign result[31:16] = 16'h0; endmodule // 1.1 module unsigned_add( // _1 input [15:0] ina, inb, output [16:0] result); assign result = ina + inb; endmodule module unsigned_add_clip( // _2 input [15:0] ina, inb, output [15:0] result, output error); wire [16:0] work = ina + inb; assign result = work[16] ? {16{1'b1}} : work[15:0]; assign error = work[16]; endmodule module unsigned_sub_clip( // _3 input [15:0] ina, inb, output [15:0] result, output error); wire [16:0] work = ina - inb; assign result = work[16] ? {16{1'b0}} : work[15:0]; assign error = work[16]; endmodule // 1.2 module signed_add( // _4 input [15:0] ina, inb, output [16:0] result); assign result = {ina[15], ina} + {inb[15], inb}; endmodule module signed_sub( input [15:0] ina, inb, output [16:0] result); assign result = {ina[15], ina} - {inb[15], inb}; endmodule module signed_add_check_alt( // _5 input [15:0] ina, inb, output [15:0] result, output overflow); assign result = ina + inb; assign overflow = ~(ina[15] ^ inb[15]) & (ina[15] ^ result[15]); endmodule module signed_add_check( // _6 input [15:0] ina, inb, output [15:0] result, output overflow); wire [16:0] work = {ina[15], ina} + {inb[15], inb}; assign result = work[15:0]; assign overflow = ^work[16:15]; endmodule module signed_clip( // _7 input [31:0] in, output [15:0] result, output error); assign error = ~&in[31:15] & |in[31:15]; assign result = ~error ? in[15:0] : (in[31] ? 32'h8000 : 32'h7FFF); endmodule