Verilog乘法模块仿真报错:'F3不是合法左值'及'Behavioral Modeling不是合法左值'问题求助
Let's walk through why you're getting those errors and fix your code to match the truth table you provided.
Why You're Seeing These Errors
1. L-Value Mismatch
The error F3 is not a valid l-value happens because in your Multiply module, F3-F0 are declared as wire outputs. Wire types can only be driven by continuous assignments (assign statements) or module instances—you can't assign directly to them inside an always block. To fix this, you need to declare your outputs as reg since they're being updated in a procedural block.
2. Broken Logic Implementation
Your original always block has a fatal flaw: the if({A1,A0}*{B1,B0}) condition checks if the product is non-zero, but then you just assign multiple values to {F3,F2,F1,F0} in sequence. Only the last assignment (4'b1001) would ever take effect, which doesn't align with your truth table at all. You need to explicitly map every input combination to its corresponding output—this is exactly what a case statement is designed for.
Corrected Verilog Code
Fixed Multiply Module
module Multiply(A1, A0, B1, B0, F3, F2, F1, F0); input A1, A0, B1, B0; output reg F3, F2, F1, F0; // Changed to reg for procedural assignment always @(A1, A0, B1, B0) begin // Case statement directly maps every input combination to your truth table case({A1, A0, B1, B0}) 4'b0000: {F3,F2,F1,F0} = 4'b0000; 4'b0001: {F3,F2,F1,F0} = 4'b0000; 4'b0010: {F3,F2,F1,F0} = 4'b0000; 4'b0011: {F3,F2,F1,F0} = 4'b0000; 4'b0100: {F3,F2,F1,F0} = 4'b0000; 4'b0101: {F3,F2,F1,F0} = 4'b0001; 4'b0110: {F3,F2,F1,F0} = 4'b0010; 4'b0111: {F3,F2,F1,F0} = 4'b0011; 4'b1000: {F3,F2,F1,F0} = 4'b0000; 4'b1001: {F3,F2,F1,F0} = 4'b0010; 4'b1010: {F3,F2,F1,F0} = 4'b0100; 4'b1011: {F3,F2,F1,F0} = 4'b0110; 4'b1100: {F3,F2,F1,F0} = 4'b0000; 4'b1101: {F3,F2,F1,F0} = 4'b0011; 4'b1110: {F3,F2,F1,F0} = 4'b0110; 4'b1111: {F3,F2,F1,F0} = 4'b1001; default: {F3,F2,F1,F0} = 4'b0000; // Fallback for unexpected inputs endcase end endmodule
Updated Testbench
module testbench; reg [1:0] A, B; wire F3, F2, F1, F0; // Instantiate the multiplier module Multiply test(A[1], A[0], B[1], B[0], F3, F2, F1, F0); initial begin $display("--------------------------------------------------------"); $display("Multiplication of Two 2-Bit Inputs -> 4-Bit Output"); $display("--------------------------------------------------------"); $display("Time\tA\tB\tF3\tF2\tF1\tF0"); // Fixed typo in column header $display("--------------------------------------------------------"); // Show A/B as binary for easier truth table verification $monitor("%g\t%b\t%b\t%d\t%d\t%d\t%d", $time, A, B, F3, F2, F1, F0); #16 $finish; // Extended to cover all 16 input combinations end // Generate all input combinations via toggling bits initial begin A = 2'b00; B = 2'b00; end always #1 B[0] = ~B[0]; always #2 B[1] = ~B[1]; always #4 A[0] = ~A[0]; always #8 A[1] = ~A[1]; endmodule
Key Improvements Explained
- Output Type Correction: Changing
F3-F0toregallows us to assign them inside thealwaysblock without l-value errors. - Case Statement Logic: This directly implements your truth table by mapping each 4-bit input combination to its exact output—no more overwriting values or missing cases.
- Testbench Polish: Fixed a typo in the display header, switched A/B to show as binary (makes verifying against your truth table easier), and extended simulation time to ensure all 16 input combinations are tested.
内容的提问来源于stack exchange,提问作者Connor Mcgee

