如何依次运行此Verilog模块?

问题描述

我想让测试平台按顺序运行。我期望的是首先运行AES_input,完成后运行第二个模块AES_TOP。我设置了一个参数i_out1,如果AES_input i_out变为0到1,则第二个模块运行

我检查它是否已成功编译,但发现它是非法连接。我不知道如何解决这个问题。还有其他方法可以按顺序运行这些模块吗?

`timescale 1ns / 1ps

module AES_TB;

// Inputs
reg clk;

parameter i_out1 = 1'b0;
wire [258943:0] p_out;
wire a_out;
wire [258943:0] dataout;




AES_input t1 (.p_out(p_out),.i_out(i_out1));

generate if(i_out1 == 1)begin : ci
    AES_TOP t2 (
        .clk(clk),.p(p_out),.dataout(dataout),.a_out(a_out));

end
endgenerate



AES_output t3 (.dataout(dataout),.a_out(a_out));



endmodule

解决方法

Verilog是一种“硬件描述语言”,不是通用的编程语言。这样,它允许描述硬件系统的结构。硬件本身没有顺序。它在很大程度上是并行的。硬件评估的结果取决于输入信号,元件之间的连接以及先前的状态。

Verilog尝试通过提供硬件modules来模仿硬件行为。模块按实例的层次结构描述硬件层次结构,仅此而已。它们不能被“执行”,也不能被“顺序”执行。模块实例通过传输信号值的“电线”相互连接。

模块本身是根据连续分配和过程块(例如“ always”块)描述的。它们描述了模块和底层硬件设备内部的连接。它们也通过模块内部的一组电线连接。 Verilog中唯一的顺序编程块存在于描述硬件设备行为的程序块中。

为了模拟硬件Verilog的并行行为,采用了event-driven技术。这意味着某个程序块将在且仅当其输入的至少一个值发生变化时才被评估。结果,设备模型的评估顺序取决于模型中信号的值。模块只是这些设备型号的容器,而从不进行整体评估。

在您的情况下,您多次实例化几个模块,使其通过同一根导线作为输出导线。 Verilog对如何评估这些导线非常挑剔。在这种情况下,您很可能在此类电线上出现“ x”。原因是verilog根据上述规则对它们进行了评估,并确定同一根线是由具有不同值的多个设备驱动的。在并行硬件世界中,它不知道哪个值正确,因此将“ x”放在那里。

例如,为了在verilog中描述分配的顺序,您需要提供更多的连线,例如

     wire in,out[3];
     moda mod1(.in(in),.out(out[0]);
     modb mod2(.in(out[0]),.out(out[1]));
     modc mod3(.in(out[1]),.out(out[2]));
     
     ...

通过这种方式,您可以将“ in”用作刺激输入,而out [2]则用作测试台的有用导线。

,

HDL允许您创建可同时运行的结构-该结构存在,唯一的顺序性质是传递给它的数据。在下面,我添加了一个时钟源,以便您的内部逻辑可以有一个用于顺序处理的时钟,还添加了一个初始语句,以便您可以顺序更改输入值。您的块似乎没有输入-HDL中的大多数块都是传递函数-一些函数对一组输入进行操作以产生输出。我删除了generate语句-首先从三个实例开始,然后按所需方式连接它们。然后,如果需要更多资源,请添加generate语句。

`timescale 1ns / 1ps

module AES_TB;

// Inputs
reg clk=0; //initialize clock,otherwise you will just have x's (red)
always #4 clk=!clk; // define clock function

parameter i_out1 = 1'b0;
wire [258943:0] p_out;
wire a_out;
wire [258943:0] dataout;

reg i0,i1,i2;
initial begin // this creates sequential vector assignment
  i0=0; // initialize values
  i1=0;
  i2=0;
  #5;
  i0=1;//after some time,assign values
  i1=1;
  i2=1;
  @(posedge clk);
  i0=0;//after clock,assign values
  i1=0;
  i2=0;



end


AES_input t1 (
   .some_control_input(i0),.p_out(p_out),.i_out(i_out1));
AES_input t2 (
   .some_control_input(i1),.p_out(i_out1),.i_out(i_out2));
AES_output t3 (
   .some_control_input(i2),.dataout(dataout),.a_out(a_out)
);



endmodule
,

基本上,数字系统设计中不能连续运行模块。它们都是并行执行的。在逻辑门env中,不能一一执行。

但是在这种情况下,您可以做的是为每个模块提供一个使能和完成信号。因此,对于第一个模块,您可以从测试平台提供启用,然后对于下一个模块,将前一个模块的启用完成信号绑定在一起。这样,您可以管理级联执行。