Verilog模块无法计算& b和a | b

时间:2016-03-20 05:48:56

标签: verilog iverilog

我正在创建verilog模块,用于计算a + b,a-b,a& a中的任何一个。 b或a湾

问题是它确实计算了a + b和a-b。 但它无法计算出一个& b和a b并且不返回任何内容。

input [31:0] a, b;
input [2:0] op;
output [31:0] z;
output ex; 
wire[31:0]a0,a1,a2,a3;

assign a0 = a & b;
assign a1 = a | b;
assign a2 = a + b;
assign a3 = a - b;

assign z=a0;
//assign z=a1;
//assign z=a2;
//assign z=a3;

endmodule

该模块基本上计算a + b,a-b,a& b和a | b,并将其计算值分配给z。

它确实成功计算了a + b和a-b并将计算值计算到z。

但是对于a& b和a | b,它并没有为z指定任何内容。

我该如何解决这个问题?

非常感谢你能帮助我。

2 个答案:

答案 0 :(得分:0)

我确定它确实为z分配了一些内容。问题是你试图为z分配太多。

每个assign语句代表一些硬件,在这种情况下驱动wire z。因此,您从4个独立的硬件块中驱动z 4次并行。如果你愿意,你就会发生短路。 (请记住,Verilog是一种硬件描述语言。您在这里设计硬件,而不是编写软件。如果您从一个以上分配线路你把一些硬件的输出短路在一起。)

我注意到有一个input [2:0] op。这看起来像是我的家庭作业,我想你被要求设计一个ALU。 ALU是一块硬件(在这种情况下是组合逻辑),可以对其输入(其操作数)执行各种操作,在本例中为a和{ {1}}。它执行的操作需要通过其他一些控制输入来选择,在这种情况下几乎可以肯定是b

因此,您需要使用opopza+b来测试a-b和驱动a&b的代码。对我来说,这项工作的一个显而易见的结构是a|b陈述:

case

case (op) 3'b000: z = // some expression, eg a + b, it depends on what op code 000 is supposed to mean 3'b001: z = // some other expression here // etc etc default: // perhaps... z = // ...something to drive z if none of the other branches are used endcase 语句应该放在case块中。由于我怀疑这是作业,我不会给你答案,我会让你知道如何做到这一点。

最后,我看到always是3位宽。这表明您的ALU有超过4种不同的操作要执行。我还看到有一个op输出,可能需要做一些事情。

答案 1 :(得分:0)

这里有一些混乱。您原来发布的代码很好; {1}}将根据您的需要进行分配。另一个答案是错误的 - 没有多个驱动程序;他们被评论出来了。延迟建议也是错误的 - 延迟对你的逻辑没有任何影响。