错误(10219):Mux.v(19)处的Verilog HDL连续分配错误:分配左侧的对象“muxout”必须具有网络类型

时间:2016-10-02 07:10:26

标签: verilog quartus

我想用计数器和MUX制作分频器。

我为项目制作3个模块

// 4位计数器

module Counter (input clk, input reset, output reg[3:0] out);

   always@(posedge clk or posedge reset)
   begin
      if(reset)
         out = 4'b0000; 
      else
      begin
         if(clk)
            if(out < 4'b1111)
            out = out + 4'b0001;
            else
            out = 4'b0000;
      end
   end


endmodule

// module 4by1 Mux

module Mux (input [3:0] muxin , input [1:0] sel, output reg muxout);


   function _4by1mux;

      input [3:0] muxin;
      input [1:0] sel;

      case (sel)
         2'b00 : _4by1mux = muxin[0];
         2'b01 : _4by1mux = muxin[1];
         2'b10 : _4by1mux = muxin[2];
         2'b11 : _4by1mux = muxin[3];
      endcase
   endfunction

   assign muxout = _4by1mux(muxin, sel);


endmodule

// module freqDivider

 module freqDivider(input clk, input reset, input [1:0] sel, output reg muxout);

   wire [3:0]counterbus;

   Counter ct1 (clk, reset, counterbus);
   Mux mux1 (counterbus, sel, muxout);

endmodule

模块freqDivider是top,我调用模块Counter和Mux

但模块Mux有问题

Error (10219): Verilog HDL Continuous Assignment error at Mux.v(19):
object "muxout" on left-hand side of assignment must have a net type

此错误

PS。输入sel将按时间更改

2 个答案:

答案 0 :(得分:1)

错误是muxout输出的类型为reg而非类型wire的结果。在verilog中,行可以有两种总体类型,网络(如wire类型)或变量(如reg类型)。要为网络类型分配值/逻辑,您需要使用assign语句而不是always块。要将值/逻辑分配给变量类型,您只能使用always块而不能使用assign语句。因此,您可以将assign模块中的Mux设为always块,或者为了更简单的解决方案,不要将muxout输出设为{{{} 1}},只需省略reg关键字,它就是reg

答案 1 :(得分:0)

错误是您已将mux_out声明为reg类型,而不是线型。任何端口的默认类型都是wire。您正通过assign关键字在该网络上进行连续分配。在reg类型的网络上,赋值只能在程序块(初始,始终)内完成。

仅从mux_out更改为output regoutput