【问题标题】:Behavioral Modeling is not a valid l-value in testbench.test行为建模在 testbench.test 中不是有效的左值
【发布时间】:2021-04-09 13:07:51
【问题描述】:

我正在尝试使用两个二进制输入 A 和 B 来获得二进制输出,即 F 就像下面的真值表一样,但它一直在说:

main.v:36: error: F3 is not a valid l-value in testbench.test
main.v:27:      : F3 is declared here as wire.

这是我的模型的真值表。

A1 A0 B1 B0| F3 F2 F1 F0
0  0  0  0 | 0  0  0  0
0  0  0  1 | 0  0  0  0
0  0  1  0 | 0  0  0  0
0  0  1  1 | 0  0  0  0
0  1  0  0 | 0  0  0  0
0  1  0  1 | 0  0  0  1
0  1  1  0 | 0  0  1  0
0  1  1  1 | 0  0  1  1
1  0  0  0 | 0  0  0  0
1  0  0  1 | 0  0  1  0
1  0  1  0 | 0  1  0  0
1  0  1  1 | 0  1  1  0
1  1  0  0 | 0  0  0  0
1  1  0  1 | 0  0  1  1
1  1  1  0 | 0  1  1  0
1  1  1  1 | 1  0  0  1
  

我的 icarus Verilog 代码在这里:


module Multiply(A1,A0,B1,B0,F3,F2,F1,F0);
input A1,A0,B1,B0;
output F3,F2,F1,F0;


always@(A1 or A0 or B1 or B0) 
begin 

if({A1,A0}*{B1,B0})

begin
{F3,F2,F1,F0}=4'b0001;
{F3,F2,F1,F0}=4'b0010;
{F3,F2,F1,F0}=4'b0011;
{F3,F2,F1,F0}=4'b0010;
{F3,F2,F1,F0}=4'b0100;
{F3,F2,F1,F0}=4'b0110;
{F3,F2,F1,F0}=4'b1001;
end

end

endmodule 

module testbench;
reg [1:0] A,B; // these are like switches
wire F3,F2,F1,F0; // like an LED

//test the verilog model
Multiply test(A[1],A[0],B[1],B[0],F3,F2,F1,F0);

//Generate inputs
initial
begin//like {

//display the response of the circuit
//for every input combination


$display("--------------------------------------------------------");
$display("Multiplication of Two 2-Binary Inputs equal to 4-bit binary output");
$display("--------------------------------------------------------");
$display("Time\tA\tB\tF3\tF2\tF1,\tF0");
$display("--------------------------------------------------------");
$monitor("%g\t%d\t%d\t%d\t%d\t%d",$time,A,B,F3,F2,F1,F0);
#15 $finish;
end
initial begin A = 0; B = 0; 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];
always #3

$display("--------------------------------------------------------");

endmodule

【问题讨论】:

    标签: verilog hdl icarus


    【解决方案1】:

    由于您在always 块内对F3 进行分配,因此您必须将其声明为reg。 F2、F1、F0也是一样:

    module Multiply(A1,A0,B1,B0,F3,F2,F1,F0);
    input A1,A0,B1,B0;
    output F3,F2,F1,F0;
    reg F3,F2,F1,F0;
    

    这修复了编译错误并允许您的模拟运行。但是,我认为 Verilog 代码与真值表不匹配。

    编写真值表的常用方法是使用case 语句:

    module Multiply(A1,A0,B1,B0,F3,F2,F1,F0);
       input A1,A0,B1,B0;
       output F3,F2,F1,F0;
       reg    F3,F2,F1,F0;
    
       always @* begin 
            case ({A1,A0,B1,B0})
                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'b1001          : {F3,F2,F1,F0}=4'b0010;
                4'b1010          : {F3,F2,F1,F0}=4'b0100;
                4'b1011, 4'b1110 : {F3,F2,F1,F0}=4'b0110;
                4'b1111          : {F3,F2,F1,F0}=4'b1001;
                default          : {F3,F2,F1,F0}=4'b0000;
            endcase
        end
    endmodule 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 2018-02-15
      • 2013-02-26
      • 1970-01-01
      • 2019-03-21
      相关资源
      最近更新 更多