如何在verilog测试台上将4位十六进制数转换为bcd

如何在verilog测试台上将4位十六进制数转换为bcd,verilog,Verilog,我用四个4位BCD加法器设计了一个4位BCD加法器。输入“A”和“B”采用十六进制值。如何编写测试台,使输入值仅为十进制?我还必须检查以下情况: `include "bcd.v" module bcd_4(A,B,Cin,S,Cout); input [15:0] A,B; input Cin; output [15:0] S; output Cout; wire w1,w2,w3; bcd_adder U1(.A(A[3:0]),.B(B[3:0]),.Cin(Cin),.S(S[3:0]

我用四个4位BCD加法器设计了一个4位BCD加法器。输入“A”和“B”采用十六进制值。如何编写测试台,使输入值仅为十进制?我还必须检查以下情况:

`include "bcd.v"

module bcd_4(A,B,Cin,S,Cout);
input [15:0] A,B;
input Cin;
output [15:0] S;
output Cout;
wire w1,w2,w3;

bcd_adder U1(.A(A[3:0]),.B(B[3:0]),.Cin(Cin),.S(S[3:0]),.Cout(w1));
bcd_adder U2(.A(A[7:4]),.B(B[7:4]),.Cin(w1),.S(S[7:4]),.Cout(w2));
bcd_adder U3(.A(A[11:8]),.B(B[11:8]),.Cin(w2),.S(S[11:8]),.Cout(w3));
bcd_adder U4(.A(A[15:12]),.B(B[15:12]),.Cin(w3),.S(S[15:12]),.Cout(Cout));

endmodule

加法器的输入不采用十六进制值。它们是16位输入,分别代表4位BCD数字。每个数字的输入范围可以是十进制的0到15,但由于它们是BCD,任何大于9的值都是无效的

输入可以以任何基数(二进制、八进制、十进制或十六进制)指定

以下各项均相当:

if({Cout,S}==A+B+Cin) $display("pass");  
else $stop;  
要对输出进行采样,您需要将4位BCD数字进行逆转换,转换为整数


下面是一个完整的、可运行的示例,其中包括采样和验证输出的代码:

我知道了。我可以用下面的函数来写

integer a;
for (a = 0; a < 10000; a = a + 1) begin

  // a is an integer
  // A is a 16-bit, 4-digit BCD value

  A[3:0] = a % 10;            // digit 0, ones place
  A[7:4] = (a / 10) % 10;     // digit 1, tens place
  A[11:8] = (a / 100) % 10;   // digit 2, hundreds place
  A[15:12] = (a / 1000) % 10; // digit 3, thousands place

end

我可以调用此函数将
{Cout,S}
转换为十六进制。

@Dwikle没有在unix中使用vi编辑器。我已使用for循环生成输入值。默认情况下,输入值为十六进制,因此我必须将其转换为十进制,产生的十进制结果将转换为十六进制,以检查我上面提到的条件。这是一个16位bcd加法器,而不是4位bit@user3331420在更好地理解您的问题后,我更新了我的答案。我不知道vi和什么有什么关系。。。如果要循环并生成应在testbench中编码的值。@dwikle…您提到的链接没有打开。如何将上述代码作为函数编写
integer a;
for (a = 0; a < 10000; a = a + 1) begin

  // a is an integer
  // A is a 16-bit, 4-digit BCD value

  A[3:0] = a % 10;            // digit 0, ones place
  A[7:4] = (a / 10) % 10;     // digit 1, tens place
  A[11:8] = (a / 100) % 10;   // digit 2, hundreds place
  A[15:12] = (a / 1000) % 10; // digit 3, thousands place

end
function integer hexatodecimal;
 input [16:0] a; 
 integer b;
 begin
 b=a[3:0]+a[7:4]*10+a[11:8]*100+a[15:12]*1000+a[16]*10000;
 hexatodecimal=b;
 end
endfunction