Verilog 使用创建的ALU制作更大的ALU

Verilog 使用创建的ALU制作更大的ALU,verilog,Verilog,我在verilog中有一个8位ALU单元,可以进行加法、逆变等操作。这个单元经过测试,性能正常。当我将其中的4个组合在一起生成一个更大的ALU时,每个输出都是正确的,除非我选择加法运算,否则结果是 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 01010101,基本上第一个alu正确工作,然后第二个alu的输出是xxxxxxxx,第三个和第四个alu也是如此。这真令人沮丧 8位模块(如果这个模型是行为模型还是结构模型,那就很好了,我选择前者!) 下面是大一点的

我在verilog中有一个8位ALU单元,可以进行加法、逆变等操作。这个单元经过测试,性能正常。当我将其中的4个组合在一起生成一个更大的ALU时,每个输出都是正确的,除非我选择加法运算,否则结果是
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 01010101
,基本上第一个alu正确工作,然后第二个alu的输出是
xxxxxxxx
,第三个和第四个alu也是如此。这真令人沮丧

8位模块(如果这个模型是行为模型还是结构模型,那就很好了,我选择前者!)

下面是大一点的代码:

module alu_32bit(
  output [31:0] out,
  output cout,g,e,
  input [31:0] A,B,
  input cin,
  input [2:0] S

);

  wire e1,e2,e3,e4;
  wire g1,g2,g3,g4;


  alu_8bit ALU1(out[7:0],cin2,g1,e1,A[7:0],B[7:0],cin,S);
  alu_8bit ALU2(out[15:8],cin3,g2,e2,A[15:8],B[15:8],cin2,S);
  alu_8bit ALU3(out[23:16],cin4,g3,e3,A[23:16],B[23:16],cin3,S);
  alu_8bit ALU4(out[31:24],cout,g4,e4,A[31:24],B[31:24],cin4,S);

  assign g = g4 | (e4 & g3) |(e4 & e3 & g2) | (e4& e3 & e2 & g1);
  assign e = e4 & e3 & e2 & e1;

endmodule 
有谁能帮上忙吗?!如果你需要更多的信息就告诉我

编辑:

波形pic输入正确,但输出不正确

数据流图显示ALU1输出很好


您的ALU主要部分的灵敏度列表不包括
cin

您检查过ALU1(加法器)的进位不是X吗?是的,进位是零,下一个的输入是正确的。您想让我输入8位的进位吗?8位ALU可能很有用,一张ALU2波形的截图可能也很有用。哈哈,我要花很长时间才能意识到。。。谢谢。你能指出这个模块是结构模型还是行为模型吗@Doggynub,使用定时ALU会容易得多。@Doggynub我建议将
始终@(a或B或S)
替换为
始终*
,不要再担心敏感度列表。它们通常仅用于模拟,被合成工具忽略。
module alu_32bit(
  output [31:0] out,
  output cout,g,e,
  input [31:0] A,B,
  input cin,
  input [2:0] S

);

  wire e1,e2,e3,e4;
  wire g1,g2,g3,g4;


  alu_8bit ALU1(out[7:0],cin2,g1,e1,A[7:0],B[7:0],cin,S);
  alu_8bit ALU2(out[15:8],cin3,g2,e2,A[15:8],B[15:8],cin2,S);
  alu_8bit ALU3(out[23:16],cin4,g3,e3,A[23:16],B[23:16],cin3,S);
  alu_8bit ALU4(out[31:24],cout,g4,e4,A[31:24],B[31:24],cin4,S);

  assign g = g4 | (e4 & g3) |(e4 & e3 & g2) | (e4& e3 & e2 & g1);
  assign e = e4 & e3 & e2 & e1;

endmodule