Verilog中导线和寄存器的非阻塞同时分配

Verilog中导线和寄存器的非阻塞同时分配,verilog,nonblocking,assign,Verilog,Nonblocking,Assign,我有兴趣写Verilog模块,它将同时更新几个输出 类似于以下代码,同时执行3个操作(clk 10): 模块mymodule(a、b、c、d、e); 输入a; 输入b; 输出c; 输出d; 输出e; 导线b; 导线a; 导线c; 导线d; 注册e; 初始开始 c如何在10个时间单位或时钟后一次性分配变量: 作为测试台级别的构造: reg c,d,e; initial begin #10; c = a+b; d = a; e = b; end 对于RTL(合成),首先需要一个带时

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

模块mymodule(a、b、c、d、e);
输入a;
输入b;
输出c;
输出d;
输出e;
导线b;
导线a;
导线c;
导线d;
注册e;
初始开始

c如何在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
wire enable=(计数器==4'b10);
始终@(posedge clk或negedge rst_n)开始
如果开始

c你想用
#10
做什么,给连续赋值增加延迟?@Morgan-我需要c、d和e的所有3个辅助操作在同一个时钟上完成(时钟10)。你需要时钟作为输入,然后推断触发器。注意:a+b将是2位结果,你只保留LSB,这是异或操作
^
辅助应定时到clk 10。感谢更新。但输出不仅应在同一时钟上更新,还应在特定时钟上更新(例如clk 10)-好的。我知道这是一个延迟。你能告诉我如何使用clk输入-在clk为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