在 Verilog 中应用模数

问题描述 投票:0回答:1
module mod_dp_32bit (
    input wire clk,
    input wire rst,
    input wire start,
    input wire [31:0] A,
    input wire [31:0] B,
    output wire done,
    output wire [31:0] result
);

reg [31:0] temp;

always @(posedge clk or posedge rst) begin
    if (rst) begin
        temp <= 32'b0;
    end 
     else if (start) begin
        temp <= A;
    end 
     else if (temp >= B) begin
        temp <= temp - B;
    end 
     else begin
        temp <= temp; 
    end
end


assign done = (temp < B);
assign result = temp;

endmodule

`timescale 1ns/1ns

    module Mod32_TB;
      
      reg clk;
      reg rst;
      reg start;
      reg [31:0] A;
      reg [31:0] B;
      wire done;
      wire [31:0] result;
    
      // Instantiate mod_dp_32bit module
      mod_dp_32bit uut (
        .clk(clk),
        .rst(rst),
        .start(start),
        .A(A),
        .B(B),
        .done(done),
        .result(result)
      );
    
      // Clock generation
      initial begin
        clk = 0;
        forever #5 clk = ~clk;
      end
    
      // Test Case 1: A mod B
      initial begin
        // Initialize inputs
        rst = 0;
        A = 100;
        B = 7;
        start = 0;
    
        // Release reset
        #10 rst = 0;
    
        // Test Case 1: A mod B
        #5 start = 1;
        #100 start = 0;
        #100;
    
        // Display result
        $display("Test Case 1 Result: A mod B = %d", result);
    
        // End simulation
        $stop;
      end
    
    endmodule

我正在尝试用 Verilog 编写一个模块,该模块使用 32 位操作数执行模运算。该模块的操作如下:

temp = a;

while(temp >= b)
     temp = temp - b;
result = temp;

此代码在计算 95 mod 12 和 5 mod 10 等模运算时,错误地计算了 100 mod 7 和 255 mod 7 等模运算。问题是什么?

verilog system-verilog
1个回答
0
投票

这是您的代码的作用:

  • 当 start 为 1 时,每个时钟周期将结果设置到 A 输入。
  • 当start为0时,每次循环都会从结果中减去B,直到结果小于或等于B。
  • 对于测试台中 A 和 B 的值,如果让仿真运行足够长的时间(启动变低后至少 13 个周期),结果将为 2。

您说您希望它计算模数,但您没有说出您期望的结果。您可以只使用 Verilog 模运算符:

%

© www.soinside.com 2019 - 2024. All rights reserved.