Signed and unsigned numbers let us represent positive and negative values differently in digital circuits.
Signed vs unsigned representation in Verilog
reg signed [3:0] a; // signed 4-bit register reg [3:0] b; // unsigned 4-bit register
Use the keyword signed before the bit width to declare signed variables.
By default, Verilog treats variables as unsigned if signed is not specified.
reg signed [3:0] a = 4'b1101; // -3 in signed 4-bit reg [3:0] b = 4'b1101; // 13 in unsigned 4-bit
wire signed [7:0] diff; assign diff = a - b;
This program shows how the same bits add differently when treated as signed or unsigned.
module test_signed_unsigned; reg signed [3:0] a = 4'b1101; // -3 reg [3:0] b = 4'b1101; // 13 wire signed [4:0] sum_signed; wire [4:0] sum_unsigned; assign sum_signed = a + b; assign sum_unsigned = a + b; initial begin $display("Signed a: %0d", a); $display("Unsigned b: %0d", b); $display("Sum as signed: %0d", sum_signed); $display("Sum as unsigned: %0d", sum_unsigned); end endmodule
Signed numbers use the most significant bit as the sign bit (0 for positive, 1 for negative).
Unsigned numbers represent only positive values and zero.
Mixing signed and unsigned in expressions can lead to unexpected results if not careful.
Signed variables can hold negative and positive numbers; unsigned only positive.
Use signed keyword to declare signed variables in Verilog.
Always be careful when mixing signed and unsigned values in calculations.
Practice
Solution
Step 1: Understand signed vs unsigned meaning
Signed variables can represent negative and positive values, unsigned only positive values.Step 2: Check declaration keywords
Signed variables use thesignedkeyword; unsigned variables do not use it.Final Answer:
Signed variables can hold both negative and positive numbers, unsigned variables hold only positive numbers. -> Option AQuick Check:
Signed = negative and positive [OK]
- Thinking unsigned can hold negative numbers
- Confusing declaration keywords
- Assuming signed and unsigned behave identically
Solution
Step 1: Recall syntax for signed declaration
In Verilog, signed variables are declared with the keywordsignedbefore the bit range.Step 2: Check each option's syntax
reg signed [7:0] my_var; usesreg signed [7:0] my_var;which is correct syntax for an 8-bit signed variable.Final Answer:
reg signed [7:0] my_var; -> Option DQuick Check:
Signed keyword before bit range = correct [OK]
- Placing 'signed' after variable name
- Using 'unsigned' keyword which is invalid
- Omitting 'signed' keyword for signed variables
4'b1101 in Verilog?Solution
Step 1: Interpret 4-bit signed binary 1101
In 4-bit signed, the leftmost bit is sign bit. 1 means negative. The value is two's complement.Step 2: Calculate two's complement value
Invert bits: 0010, add 1: 0011 (decimal 3). So original number is -3.Final Answer:
-3 -> Option AQuick Check:
4-bit signed 1101 = -3 [OK]
- Reading binary as unsigned
- Ignoring two's complement for negative numbers
- Confusing bit order
reg signed [3:0] a = 4'b1010; reg [3:0] b = 4'b0101; wire [4:0] sum = a + b;
What is the problem with this code?
Solution
Step 1: Identify variable types in addition
Variable 'a' is signed, 'b' is unsigned. Adding signed and unsigned directly can cause unexpected results.Step 2: Understand Verilog rules for mixed signed/unsigned
Verilog treats unsigned as signed 0-extended or may cause wrong sign extension. Proper casting is needed.Final Answer:
You cannot add signed and unsigned variables directly without casting. -> Option BQuick Check:
Mixing signed and unsigned needs casting [OK]
- Ignoring signed/unsigned mismatch
- Assuming bit width is the only issue
- Thinking signed variables can't be added
a and b in a signed 6-bit variable diff. Which Verilog code correctly handles the signed result?Solution
Step 1: Understand the problem of unsigned subtraction
Subtracting unsigned numbers can produce negative results, so result must be signed and wide enough.Step 2: Check casting and bit width
reg signed [5:0] diff = $signed(a) - $signed(b); casts both operands to signed before subtraction and uses 6 bits for result, correctly handling negative values.Final Answer:
reg signed [5:0] diff = $signed(a) - $signed(b); -> Option CQuick Check:
Cast operands signed before subtracting unsigned numbers [OK]
- Not casting operands to signed
- Using too few bits for result
- Assuming unsigned subtraction can yield negative
Ready to prove it?
Pass the test and this pattern moves unknown
