Verilog模型sim

时间:2017-04-23 19:01:08

标签: verilog modelsim

我想在一个将从顶部调用的模块中拆分verilog程序。 这是一个显示输出和每一位的计数器。

module file1(output reg b3,
 output reg b2,
  output reg b1,
 output reg b0,
output reg[3:0]y);

reg clock;
initial begin
  clock=0;
  b0=0;
  b1=0;
  b2=0;
  b3=0;
  y=0;
  forever #5 clock= ~clock;
end
always @(posedge clock)
    begin
    y=y+1;
    b0=y[0];
    b1=y[1];
    b2=y[2];
    b3=y[3];
    end
endmodule

这是我在top调用的模块中拆分程序的方法。 MODULE

module modul(input reg clock,
output reg b3,
output reg b2,
output reg b1,
output reg b0,  
output reg[3:0]y
);
always @(posedge clock)
    begin
    y=y+1;
    b0=y[0];
    b1=y[1];
    b2=y[2];
    b3=y[3];
    end
endmodule

TOP

 `timescale 1ns/1ps
    module testare_modul;
    reg clock; wire clock1;
    reg b3;   
    reg b2;
    reg b1;
    reg b0;  
    reg [3:0]y;
    modul lol(
    .clock(clock),
    .y(y),
    .b3(b3),
    .b2(b2),
    .b1(b1),
    .b0(b0)
    );
    initial begin
      clock=0;
      b0=0;
      b1=0;
      b2=0;
      b3=0;
      y=0;
      forever #5 clock= ~clock;
    end
    endmodule

我在编写时有0个错误,但是当我尝试模拟我得到非法输出或inout端口连接时。我是这些语言的新手,我非常感谢你的帮助!

2 个答案:

答案 0 :(得分:0)

这个output reg[3:0]y肯定应该是input reg[3:0]y

答案 1 :(得分:0)

这里有几件事。 在modul中,您已将时钟定义为输入reg。输入不能是reg。他们只是投入。所以clk必须定义为

input clock,

其次,您已将y定义为输出reg,但它也是一个输入,因为您从顶层模块驱动y的值。如果确实需要此功能,则需要将y定义为inout。然而,如果它被声明为inout,那么它不能始终被驱动,你需要一些其他信号来控制端口是输入并由模块内的驱动程序进行三态控制,以及何时模块驱动端口即输出,因此它必须在顶级模块的驱动程序中处于三态。

如果您解释一下您在此设计中尝试实现的功能以便社区提供帮助,那会更好。

请注意,verilog中的模块上的电线注册和端口与“C”中传递的函数参数不同