-1

我有兴趣编写同时更新多个输出的 Verilog 模块,类似于以下代码,同时进行 3 个操作(clk 10):

module mymodule (a,b,c,d,e);
input a;
input b;
output c;
output d;
output e;

wire b;
wire a;
wire c;
wire d;

reg e;

initial begin
c <=  #10  (a+b);
d <=  #10  a;
e  <= #10  b;
end

endmodule

那个代码合法吗?

4

1 回答 1

3

如何在 10 个时间单位或时钟后一次性分配变量:

作为测试平台级别的构造:

reg c,d,e;
initial begin
  #10;
  c = a+b;
  d = a;
  e = b;
end

对于 RTL(综合),首先您需要一个带时钟的测试台。
我会在我的测试工具中生成一个这样的时钟:

reg clk ; //Rising edge every 10 timesteps
initial begin
  clk = 0;
  #5; 
  forever begin
    #5 ;
    clk = ~clk;
  end
end

建立一个计数到 10 的计数器,一旦达到 10,就使触发器能够加载新值。

wire enable = (counter == 4'b10);
always @(posedge clk or negedge rst_n) begin
  if (~rst_n) begin
    c <= 1'b0;
    d <= 1'b0;
    e <= 1'b0;
  end
  else if (enable) begin
    c <=  (a+b);
    d <=   a;
    e <=   b;
    end
  end
endmodule

额外的 Verilog 提示
输出是隐含的连线,无需重新定义它们。

非阻塞分配<=用于在@(posedge clk)推断触发器时始终使用。

regs 或logic类型可以在内部alwaysinitial块中分配。wires 用于assign或用于端口之间的连接。

于 2013-03-13T10:52:42.843 回答