你能告诉我为什么这个简单的verilog程序不能按我的要求打印4吗?
primitive confrontatore(output z, input x, input y);
table
0 0 : 1;
0 1 : 0;
1 0 : 0;
1 1 : 1;
endtable
endprimitive
比较:
module comparatore (r, x, y);
output wire r;
input wire [21:0]x;
input wire [21:0]y;
wire [21:0]z;
genvar i;
generate
for(i=0; i<22; i=i+1)
begin
confrontatore t(z[i],x[i],y[i]);
end
endgenerate
assign r = & z;
endmodule
commutatore:
module commutatore (uscita_commutatore, alpha);
output wire [2:0]uscita_commutatore;
input wire alpha;
reg [2:0]temp;
initial
begin
case (alpha)
1'b0 : assign temp = 3;
1'b1 : assign temp = 4;
endcase
end
assign uscita_commutatore = temp;
endmodule
prova:
module prova();
reg [21:0]in1;
reg [21:0]in2;
wire [2:0]uscita;
wire uscita_comparatore;
comparatore c(uscita_comparatore, in1, in2);
commutatore C(uscita, uscita_comparatore);
initial
begin
in1 = 14;
$dumpfile("prova.vcd");
$dumpvars;
$monitor("\n in1 %d in2 %d -> uscita %d uscita_comparatore %d \n", in1, in2, uscita, uscita_comparatore);
#25 in2 = 14;
#100 $finish;
end
endmodule
答案 0 :(得分:1)
问题出在commutatore
。您正在使用initial
,这意味着过程块仅在时间0执行。在时间0,输入alpha
为1'bx
,表示temp未分配给任何内容。使用initial
代替always @*
,alpha
每次always @*
begin
case (alpha)
1'b0 : temp = 3;
1'b1 : temp = 4;
default: temp = 3'bx; // <-- optional : to catch known to unknown transitions
endcase
end
更改时都会执行程序块。
通常,您不应在程序块中分配语句。它是合法的Verilog,但它通常是设计缺陷的来源,而且合成支持是有限的。
{{1}}
答案 1 :(得分:0)
您没有按预期输出4的原因是因为当您想要commutatore
时,initial
使用assign
阻止其中包含always @*
个句子的temp
块阻止执行组合逻辑以获得initial
。 assign
仅在模拟开始时阻止一次,而您希望连续分配作为组合逻辑。此外,不需要块中的assign
语句,它们只会使模拟行为不正常(通常,您永远不需要在另一个块initial
内使用always
, always @(*) begin
case (alpha)
1'b0: temp = 3'd3;
1'b1: temp = 3'd4;
endcase
end
等等,因为这比简单地将x设置为y具有另一种意义。
例如,你真的想要这样的东西:
confrontatore
此外,Verilog已经构建了XNOR,因此不需要xnor
,您可以使用{{1}}。