Verilog代码不打印所需的输出

时间:2014-10-21 10:43:03

标签: verilog

你能告诉我为什么这个简单的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

2 个答案:

答案 0 :(得分:1)

问题出在commutatore。您正在使用initial,这意味着过程块仅在时间0执行。在时间0,输入alpha1'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块阻止执行组合逻辑以获得initialassign仅在模拟开始时阻止一次,而您希望连续分配作为组合逻辑。此外,不需要块中的assign语句,它们只会使模拟行为不正常(通常,您永远不需要在另一个块initial内使用alwaysalways @(*) begin case (alpha) 1'b0: temp = 3'd3; 1'b1: temp = 3'd4; endcase end 等等,因为这比简单地将x设置为y具有另一种意义。

例如,你真的想要这样的东西:

confrontatore

此外,Verilog已经构建了XNOR,因此不需要xnor,您可以使用{{1}}。