Verilog 在always块中或之外实例化值

Verilog 在always块中或之外实例化值,verilog,Verilog,我已经编写了一段代码,它将根据我提供的数字和一些其他数据返回一个商数和一个提醒。我使用这些数据将数字移动到位。 我现在的问题是,如果我一个接一个地测试更多的值,我就无法很好地跟踪我的商。 我需要一种方法来初始化我的cat寄存器,这样我就不会再从以前的计算中得到残值 以下是我所说的代码: module divide( input [7:0] a, b, input [3:0] counter, msb, output reg [7:0] q, output re

我已经编写了一段代码,它将根据我提供的数字和一些其他数据返回一个商数和一个提醒。我使用这些数据将数字移动到位。
我现在的问题是,如果我一个接一个地测试更多的值,我就无法很好地跟踪我的商。
我需要一种方法来初始化我的cat寄存器,这样我就不会再从以前的计算中得到残值

以下是我所说的代码:

module divide(
  input      [7:0] a, b,
  input      [3:0] counter, msb,
  output reg [7:0] q,
  output reg [7:0] r
);
always @(*) begin
  for(i = 0; i < counter + 1  ; i = i+1) begin
    sum = s_a + s_b;     //previously calculated values
      if(sum[8-msb] == 1) begin
        assign s_a       = s_a; 
        assign s_b       = s_b >>> 1;
        cat[counter - i] = 1'b0;                
      end
      else begin
        assign s_a       = sum;
        assign s_b       = s_b >>> 1;
        cat[counter - i] = 1'b1;
      end
      assign r = s_a;
      assign q = cat;
    end
  end
endmodule 
模块划分(
输入[7:0]a,b,
输入[3:0]计数器,msb,
输出寄存器[7:0]q,
输出寄存器[7:0]r
);
始终@(*)开始
对于(i=0;i>>1;
类别[计数器-i]=1'b0;
结束
否则开始
分配s_a=总和;
分配s_b=s_b>>>1;
类别[计数器-i]=1'b1;
结束
分配r=s_a;
分配q=cat;
结束
结束
端模

注意:我已经声明了此代码中的所有寄存器,但出于某些目的,我无法在此处声明它们。

您不能在
始终
初始
块中使用
assign

cat的赋值是组合的,因此它不是触发器,即没有复位。它是
reg
类型的事实与硬件无关,而是与模拟器优化有关

我会将其写为(未进行功能更改):

这里没有包含任何触发器,除非有真正需要避免的隐含锁存,否则不涉及内存或状态。i、 e.之前没有计算值

您可能希望添加一个触发器并采用多个时钟周期来计算结果,而不是组合块

尝试以下操作,而不是使用
始终@*

always @(posedge clk or negedge rst_n) begin
  if (~rst_n) begin
     s_a <= 'b0; //Reset Value
  end
  else begin 
    s_a <= next value; //Normal logic
  end
end
始终@(posedge clk或negedge rst_n)开始
如果开始

s_a在
始终
初始
块中不使用
赋值

cat的赋值是组合的,因此它不是触发器,即没有复位。它是
reg
类型的事实与硬件无关,而是与模拟器优化有关

我会将其写为(未进行功能更改):

这里没有包含任何触发器,除非有真正需要避免的隐含锁存,否则不涉及内存或状态。i、 e.之前没有计算值

您可能希望添加一个触发器并采用多个时钟周期来计算结果,而不是组合块

尝试以下操作,而不是使用
始终@*

always @(posedge clk or negedge rst_n) begin
  if (~rst_n) begin
     s_a <= 'b0; //Reset Value
  end
  else begin 
    s_a <= next value; //Normal logic
  end
end
始终@(posedge clk或negedge rst_n)开始
如果开始

s_a在
始终
初始
块中不使用
赋值

cat的赋值是组合的,因此它不是触发器,即没有复位。它是
reg
类型的事实与硬件无关,而是与模拟器优化有关

我会将其写为(未进行功能更改):

这里没有包含任何触发器,除非有真正需要避免的隐含锁存,否则不涉及内存或状态。i、 e.之前没有计算值

您可能希望添加一个触发器并采用多个时钟周期来计算结果,而不是组合块

尝试以下操作,而不是使用
始终@*

always @(posedge clk or negedge rst_n) begin
  if (~rst_n) begin
     s_a <= 'b0; //Reset Value
  end
  else begin 
    s_a <= next value; //Normal logic
  end
end
始终@(posedge clk或negedge rst_n)开始
如果开始

s_a在
始终
初始
块中不使用
赋值

cat的赋值是组合的,因此它不是触发器,即没有复位。它是
reg
类型的事实与硬件无关,而是与模拟器优化有关

我会将其写为(未进行功能更改):

这里没有包含任何触发器,除非有真正需要避免的隐含锁存,否则不涉及内存或状态。i、 e.之前没有计算值

您可能希望添加一个触发器并采用多个时钟周期来计算结果,而不是组合块

尝试以下操作,而不是使用
始终@*

always @(posedge clk or negedge rst_n) begin
  if (~rst_n) begin
     s_a <= 'b0; //Reset Value
  end
  else begin 
    s_a <= next value; //Normal logic
  end
end
始终@(posedge clk或negedge rst_n)开始
如果开始

非常感谢。我设法使我的
cat
寄存器重新初始化,只需在算法之前添加
cat=0
。它是这样工作的。@Bodizzy如果你打算综合这个设计,我想你会遇到问题,因为你的for循环意味着硬件的动态量。在设计的下一次迭代中,我建议使用状态机执行变量循环,并在每个时钟周期执行1步。这需要计数器时钟周期。从技术上讲,您可以在prodecural块中使用assign,但这并不是真正的标准做法:非常感谢。我设法使我的
cat
寄存器重新初始化,只需在算法之前添加
cat=0
。它是这样工作的。@Bodizzy如果你打算综合这个设计,我想你会遇到问题,因为你的for循环意味着硬件的动态量。在设计的下一次迭代中,我建议使用状态机执行变量循环,并在每个时钟周期执行1步。这需要计数器时钟周期。从技术上讲,您可以在prodecural块中使用assign,但这并不是真正的标准做法:非常感谢。我设法使我的
cat
寄存器重新初始化,只需在算法之前添加
cat=0
。它是这样工作的。@Bodizzy如果你打算综合这个设计,我想你会遇到专业的