在Verilog中对电线和寄存器进行非阻塞同时分配

时间:2013-03-13 09:53:22

标签: verilog nonblocking assign

我有兴趣编写同时更新多个输出的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

该代码合法吗?

1 个答案:

答案 0 :(得分:3)

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

作为测试平台级别构造:

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

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

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)

可以在reglogic块内分配

alwaysinitial种类型。 wireassign一起使用或用于端口之间的连接。