【问题标题】:How can I run this Verilog module sequentially?如何按顺序运行这个 Verilog 模块?
【发布时间】:2020-10-11 10:54:24
【问题描述】:

我想让测试台按顺序运行。我期待的是首先运行 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

【问题讨论】:

  • 你不需要generate。您需要的所有逻辑,它们就在那里。如果您希望运行哪个,哪个不运行,请创建启用信号。

标签: verilog fpga modelsim


【解决方案1】:

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

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

模块本身是根据连续分配和程序块来描述的,例如“总是”块。它们描述了模块和低级硬件设备内部的连接。它们还通过模块内部的一组电线连接。 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]));
     
     ...

通过这种方式,您可以将“输入”用作刺激输入,将输出[2]用作您的测试台感兴趣的线路。

【讨论】:

    【解决方案2】:

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

    `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
    

    【讨论】:

      【解决方案3】:

      基本上,您不能在数字系统设计中连续运行模块。所有这些都是并行执行的。在逻辑门环境中,您不能一一执行。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        相关资源
        最近更新 更多